无法在字段中注入值

时间:2018-05-15 11:18:24

标签: spring

@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();

3 个答案:

答案 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

}