方法中的@Value注释有什么作用?

Osc*_*Ryz 14 spring annotations

我看到一个注释的方法 @Value("${some.property}")

如在

@Value("${some.property}")
public void setSomething(String param) {
    ... do something with param
}
Run Code Online (Sandbox Code Playgroud)

那里的注释是什么?

Eld*_*ael 36

基本上它告诉Spring的AutowiredAnnotationBeanPostProcessorsetSomething解析后的值some.property作为参数来调用方法......但前提是你的bean定义中有一个PropertySourcesPlaceholderConfigurer ; 如果您尚未配置一个,则后处理器只会将字符串"${some.property}"(不带引号)注入您的方法.

如果除非您使用了默认值,否则将无法解析值,将抛出IllegalArgumentException "${some.property:default}".

Spring使用当前的Environment及其PropertySources解析这些值,例如JVM系统属性,Java属性文件等.

你还可以使用Spring表达式语言(规划环境地政司)来解决类似的事情#{someBean.someMethod}#{systemProperties[user.region]}

旁注:正如文件所述

在调用任何配置方法之前,在构造bean之后立即注入字段.[...] Bean属性setter方法[在本例中]实际上只是这种通用配置方法的特例.

一个常见的错误是尝试使用注入的值在构造函数中执行某些逻辑,但此时该值尚未解析或注入,因为构造函数必须完成才能在config方法中注入值.在这些情况下,您必须在构造函数参数中使用@Value@Autowired注释.

您还可以使用@PostConstructinit-method指向将在设置bean属性后执行的方法的XML 属性.或者,您可以实现InitializingBean接口.

  • 这是一个非常好的答案,如果可以,我会给它更多的选票. (2认同)