任何人都可以向我指出Spring文档,该文档说明@Value注释中的表达式将会发生什么
我需要这个行为的书面文档,以便能够自信地使用注释。
感谢。
修改
注释的JavaDoc仅告诉您注释工作时应该发生什么。错误行为没有任何内容。
答案 0 :(得分:1)
唯一明确的文档(取决于你想要去的深度)描述的行为是源代码本身。 @Value
注释由AutowiredAnnotationBeanPostProcessor
处理。
我们一次只拿一个案例:
@Value注释中的表达式
会发生什么Throws exception
例如,
public class CustomBean {
private String value;
public String getValue() {
throw new NullPointerException();
}
public void setValue(String value) {
this.value = value;
}
}
@Component
public class MyComponent {
private static final String a = "";
@Value("#{customBean.value}")
public String value;
}
<context:component-scan base-package="com.spring"></context:component-scan>
<context:property-placeholder location="classpath:values.properties"/>
<bean id="customBean" class="com.spring.CustomBean" >
<property name="value" value="bomb"></property>
</bean>
Spring将尝试通过调用@Value
类型的bean的getValue()
getter来解析CustomBean
的值。它在org.springframework.expression.spel.support.ReflectivePropertyAccessor$OptimalPropertyAccessor#read(..)
中执行此操作(在通过SpEL堆栈解析bean和属性名称之后)。此方法有一个catch (Exception e)
块,可以捕获任何Exception
并抛出AccessException
包裹捕获的Exception
。
what will happen when the expression in a @Value annotation Returns null
考虑到这一点
public class CustomBean {
private String value;
public String getValue() {
return null;
}
public void setValue(String value) {
this.value = value;
}
}
带注释的字段的值将为null
,因为这是已解析且有效的值。如果带注释的字段是原始类型,则在尝试解包时会得到NullPointerException
。
@Value注释中的表达式
会发生什么Is missing
可能有两种方式缺失。首先,如果我们尝试引用不存在的bean的属性。例如,
@Value("#{customBean.nonExistent}")
public String value;
在注入过程中,SpEL评估将失败,因为在bean的类类型上找不到属性nonExistent
。对于好奇的人来说,这发生在org.springframework.expression.spel.ast.PropertyOrFieldReference#readProperty()
。 Spring试图检查任何可能解决它的访问者。当它通过所有这些而没有找到它时,它会抛出SpelEvaluationException
。
其次,该属性可能不存在
@Value("${properties.nonExistent}") // note $ vs #
public String value;
如果您没有包含此类属性的属性源,则会发生这种情况。已注册的PropertyPlaceholderConfigurer
(YMMV以及其他解析属性的策略)将通过您的PropertySource
对象进行尝试。如果没有找到相应的属性,您将获得无法解析占位符的IllegalArgumentException
。这发生在org.springframework.util.PropertyPlaceholderHelper#parseStringValue(..)
。