我是如下创建的Spring Boot应用程序,它作为Java独立进程运行
@Configuration
@ComponentScan(basePackages = {"com.abc.def.ghi"})
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication springApplication = new SpringApplication(Application.class);
springApplication.setWebEnvironment(false);
springApplication.run(args);
}
@Bean
public static PropertyPlaceholderConfigurer propertyPlaceholderConfigurer () {
PropertyPlaceholderConfigurer propertyPlaceholderConfigurer = new MyConfigPropertyPlaceholderConfigurer();
return propertyPlaceholderConfigurer;
}
我可以看到MyConfigPropertyPlaceholderConfigurer
实现已成功将属性加载到其Properties
成员中。
但是,在初始化MyErrorHandler
时,任何@Value
带注释的成员都没有被加载,即使它们确实存在于Properties
对象中
@Component
public class MyErrorHandler {
@Value("${max.retries}")
private Integer maxRetries;
@Value("${backoff.multiplier}")
private Integer backOffMultiplier;
public MyErrorHandler() {
super();
maximumRedeliveries(maxRetries);
backOffMultiplier(backOffMultiplier);
}
我在这里缺少什么?
答案 0 :(得分:1)
只有在实例化对象之后才能将其他bean或属性注入到带注释的字段中,因为@Autowired
,@Inject
,@Resource
和@Value
由BeanPostProcessors
。因此,当调用构造函数时,所有这些字段都将 NOT 被填充。尽管如此,您可以使用带有@Postcosnstruct
注释的(私有)方法来运行post-init逻辑,同时保证注入已经发生。
或者,您也可以使用constructor injection让spring调用具有适当参数的专用构造函数。