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

时间:2014-02-14 01:57:38

标签: spring annotations

我看到一个用@Value("${some.property}")

注释的方法

,如

@Value("${some.property}")
public void setSomething(String param) {
    ... do something with param
}

那里的注释是什么?

1 个答案:

答案 0 :(得分:30)

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

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

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

您也可以use Spring Expression LanguageSpEL)来解决#{someBean.someMethod}#{systemProperties[user.region]}

等问题

旁注:正如文档所述

  

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

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

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