有关@Value错误行为的文档

时间:2013-11-28 17:21:39

标签: java spring dependency-injection annotations

任何人都可以向我指出Spring文档,该文档说明@Value注释中的表达式将会发生什么

  • 引发异常
  • 返回null
  • 缺少

我需要这个行为的书面文档,以便能够自信地使用注释。

感谢。

修改

注释的JavaDoc仅告诉您注释工作时应该发生什么。错误行为没有任何内容。

1 个答案:

答案 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(..)