@Value 注解在构造函数中不起作用

问题描述 投票:0回答:4

为什么 Spring

@Value
注解在构造函数中不起作用?

我有这个

Email
类正在读取一些与电子邮件相关的配置。
在构造函数中,如果我放置断点,则值将为空。
但如果我调用
sendEmail
方法,就会有值。

其他类:

@Autowired
Email sender;

Email
班级:

@Component
public class Email{

    @Value("${TO_EMAIL}")
    private String toEmail;

    public Email() {        
        // Here toEmail is null 
    }

    public void sendEmail(String subject, String body) {
        // Here toEmail has value
    }
}
components inversion-of-control autowired spring-annotations spring-bean
4个回答
67
投票

据我记得,值注入发生在构造函数调用之后。

尝试将构造函数更改为:

public Email(@Value("${TO_EMAIL}") String toEmail) { 
   this.toEmail = toEmail;
}

12
投票

值注入发生在构造函数调用之后,要在您的情况下解决此问题,您可以将构造函数留空。并添加一个用“@PostConstructor”注释的方法。 这样,空的构造函数将被调用,然后值将被注入,然后 @PostConstructor 方法将被调用。


6
投票

我在使用ApplicationRunner时遇到了类似的问题

public class AppStartupRunner implements ApplicationRunner {
    @Autowired
    private Environment myEnv; //not work

    @value(${xxx.xxx}) 
    private String myValue //not work

    @Autowired
    public AppStartupRunner(Environment env) {
      System.out.println(myEnv); //null
      System.out.println(myValue); //null
    }
}

更改为以下代码后,效果完美

  @Autowired
  public AppStartupRunner(Environment env) {
      env.getProperty("key") //works!
  }

0
投票

@Value
会在构造函数完成后注入,所以必须使用构造函数注入

public Email(@Value("${TO_EMAIL}") String toEmail) { this.toEmail = toEmail;}

或使用

@PostConstruct

© www.soinside.com 2019 - 2024. All rights reserved.