Spring:在实例化最终字段的自动装配构造函数中使用应用程序属性

Vin*_*ini 1 java spring dependency-injection spring-mvc spring-boot

我在下面创建了MCVEugly.char该服务应该收到一条消息并用来自的预定义替换元音application.properties

应用程序属性:

ugly.char=x
Run Code Online (Sandbox Code Playgroud)

UglifyService.java:

public interface UglifyService {
    String uglifyMessage(String message);
}
Run Code Online (Sandbox Code Playgroud)

UglifyServiceImpl.java:

@Service
public class UglifyServiceImpl implements UglifyService {

    @Value("${ugly.char}")
    private char uglyCharFromAppProp;

    private final char uglyChar;

    @Autowired
    public UglifyServiceImpl() {
        this.uglyChar = uglyCharFromAppProp;
    }

    @Override
    public String uglifyMessage(String message) {
        return message.replaceAll("[aeiouAEIOU]", String.valueOf(uglyChar));
    }
}
Run Code Online (Sandbox Code Playgroud)

UglyCharController.java:

@Controller
public class UglyCharController {

    private final UglifyService uglifyService;

    @Autowired
    public UglyCharController(UglifyService uglifyService) {
        this.uglifyService = uglifyService;
    }

    @Value("${ugly.char}")
    private char uglyChar;

    @RequestMapping("/")
    @ResponseBody
    public String index() {
        return "Usage: http://localhost:8080/some-message";
    }

    @GetMapping("/{message:.+}")
    @ResponseBody
    public String uglifyMessage(@PathVariable String message) {
        String uglyMessage = uglifyService.uglifyMessage(message);
        return "The ugly char is: '"+ uglyChar +"'." +
                "<br>The uglifyed message is: "+ uglyMessage;
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序.java:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题在于,该服务不是替换元音,而是只是删除它们。

当请求localhost:8080/mymessage响应时应该是mymxssxgx,但我得到了mymssg

我的问题是:

  1. 为什么服务没有按预期运行?
  2. 考虑到我希望uglyChar在单例服务中成为最终的并且来自于,使其工作的正确方法是什么application.properties

注意:String.valueOf(uglyChar)如果我替换为,该服务就会开始工作String.valueOf(uglyCharFromAppProp),但uglyChar不会像我希望的那样是最终的。

小智 5

@Value当对象被实例化时,首先执行构造函数,然后设置并执行属性的值。因此,uglyChar 的值不具有该属性的值。

你可以这样做:

   private final char uglyChar;

   @Autowired
   public UglifyServiceImpl(@Value("${ugly.char}") final char uglyCharFromAppProp){
       this.uglyChar = uglyCharFromAppProp;
   }
Run Code Online (Sandbox Code Playgroud)