我看到一个用@Value("${some.property}")
,如
@Value("${some.property}")
public void setSomething(String param) {
... do something with param
}
那里的注释是什么?
答案 0 :(得分:30)
基本上它告诉Spring的AutowiredAnnotationBeanPostProcessor调用setSomething
方法,并将some.property
的已解析值作为参数......但前提是你的PropertySourcesPlaceholderConfigurer豆类定义;如果您尚未配置,则后处理器只会将字符串"${some.property}"
(不带引号)注入您的方法。
如果无法解析值,则抛出IllegalArgumentException,除非您使用了默认值,例如"${some.property:default}"
。
Spring使用当前Environment及其PropertySources解析这些值,例如JVM系统属性,Java属性文件等
您也可以use Spring Expression Language(SpEL)来解决#{someBean.someMethod}
或#{systemProperties[user.region]}
旁注:正如文档所述
在构建bean之后立即注入字段 调用config方法。 [...] Bean属性setter方法[在本例中]实际上只是这种通用配置方法的特例。
一个常见的错误是尝试使用注入的值在构造函数中执行某些逻辑,但此时该值尚未解析或注入,因为构造函数必须完成才能在config方法中注入值。在这些情况下,您必须在构造函数参数中使用@Value
或@Autowired
注释。
您还可以使用@PostConstruct
或XML init-method
属性指向将在设置bean属性后执行的方法。或者,您可以实现InitializingBean接口。