@Component
@PropertySources({ @PropertySource("classpath:mail.properties") })
public class A implements B {
@Value("${mail.team.address}")
private String teamAddress;
// has getter and setters .not shown for brevity.
现在当我调用类时,我得到teamAddress的值为NULL。但是在属性文件中,mail.team.address有一些值。
我的属性文件存在于src / main / resource文件夹
下拨打电话
A a = new A ();
a.someMethodinClassA();
答案 0 :(得分:0)
当您希望Spring解析@Value
注释时,您无法自己创建类的实例。
请参阅documentation:
请注意,@ Value注释的实际处理由BeanPostProcessor执行,这反过来意味着您不能在BeanPostProcessor或BeanFactoryPostProcessor类型中使用@Value。请参考javadoc获取AutowiredAnnotationBeanPostProcessor类(默认情况下,它会检查是否存在此批注)。
简单的解决方案:只需使用任何@Component
注释注释类,并让Spring创建类的实例。
答案 1 :(得分:0)
你无法为spring bean创建(使用“new”keywoard)。如果你这样做,spring不参与对象创建和配置,这意味着没有自动装配,bean不在Application Context等中。当然,@ Value注释不会被处理其他事情
更好的方法是将 A类注入您在示例中使用的代码:
A a = new A ();
a.someMethodinClassA();
显示成为:
@Component
public class SomeClass {
private final A a;
public SomeClass(A a) {
this.a = a;
}
public void foo() {
a.someMethodinClassA();
}
}
答案 2 :(得分:0)
你应该阅读一些关于spring依赖注入的基础知识。与@Component一起自动装配的类通过组件扫描进行扫描,其对象由弹簧容器为您创建。
这就是你不应该自己使用new关键字创建对象的原因。
在新课程中,您想要使用您的类A对象,您可以按照以下方式自动装配它:
@Component
public class TestC{
private A a; // this object will be injected by spring for you
}