为什么 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
}
}
据我记得,值注入发生在构造函数调用之后。
尝试将构造函数更改为:
public Email(@Value("${TO_EMAIL}") String toEmail) {
this.toEmail = toEmail;
}
值注入发生在构造函数调用之后,要在您的情况下解决此问题,您可以将构造函数留空。并添加一个用“@PostConstructor”注释的方法。 这样,空的构造函数将被调用,然后值将被注入,然后 @PostConstructor 方法将被调用。
我在使用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!
}
@Value
会在构造函数完成后注入,所以必须使用构造函数注入
public Email(@Value("${TO_EMAIL}") String toEmail) { this.toEmail = toEmail;}
或使用
@PostConstruct