【问题标题】:@Value Annotation not injecting values from properties file@Value Annotation 不从属性文件中注入值
【发布时间】:2011-11-17 13:55:20
【问题描述】:

我正在使用@Value 注释来获取属性,它在 Normal 方法中成功发生,但在 Class 构造函数中没有成功。谁能告诉可能是什么原因?

Class A {

    @Value("#{columnProperties['Users.Columns']}")
    String columnNames;

    A()
    {
        System.out.println("In Constructor="+columnNames);
    }

    void show()
    {
        System.out.println("In Method="+columnNames);
    }

}

当我这样做时

A obj=new A();

我得到输出

在构造函数中=null

obj.show() 给了

在方法=A,B,C

(意思是想要的结果)

我希望在调用构造函数后立即设置值。如果我将字符串声明放在静态或初始化块中,则会出现编译错误。

【问题讨论】:

标签: java spring constructor properties annotations


【解决方案1】:

nicholas.hauschild 是正确的。 @Value 将在对象构造之后注入。如果你想在构造 bean 之后做一些初始化,那么你应该实现IntializingBean

【讨论】:

    【解决方案2】:

    当对象尚未完成构造时(即对象构造器仍未完成),我们如何确定对象的成员真正准备好?在我看来,Spring 在构造函数完成之前不会注入该值。

    【讨论】:

    • 恕我直言,我对您的回答表示怀疑。构造函数注入是可能的。
    • 您绝对可以使用 Spring 进行 构造函数注入,但这不是您在上面所做的。 Nicholas 正确地建议构造函数将首先执行(并完成),然后 Spring 将执行注入。如果你想要构造函数注入,你需要向构造函数声明一个输入参数。见this
    • 是的,正如@AWhitford 建议的那样,构造函数注入需要传入一个参数。问题中发生的不是构造函数注入,而是setter 注入,它发生在创建对象之后,即构造函数执行完毕后。
    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    相关资源
    最近更新 更多