我正在使用没有 Spring Boot 的 Spring Framework 4.3。据我了解 bean 生命周期:
加载 bean 定义
使用 beanFactoryPostProcessor 类处理 bean 定义
实例化和注入 bean(以正确的顺序循环)
使用豆类
让垃圾收集器销毁 bean
PropertyPlaceholderConfigurer
是一个BeanFactoryPostProcessor
。因此@Value
必须在实例化 bean 之前读取属性。(第2步)。
这是我的代码,主类:
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
ReadValueFromFile dc = ctx.getBean(ReadValueFromFile.class);
System.out.println("Main : " + dc.getUrl());
}
ReadValueFromFile.java
@Component
@PropertySource("classpath:db/db.properties")
public class ReadValueFromFile {
@Value("${url}")
private String url;
public ReadValueFromFile() {
System.out.println("url constructor : " + url);
}
@PostConstruct
void init() {
System.out.println("url postconstruct : " + url);
}
@PreDestroy
void dest() {
System.out.println("url @PreDestroy : " + url);
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
配置类:
@Configuration
@ComponentScan(basePackages={"tn.esprit.beans"})
public class AppConfig {
//it works well without declaring this bean.
// @Bean
// public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
// return new PropertySourcesPlaceholderConfigurer();
// }
}
最后是我在 src/main/resources/db 下的属性文件:
url=jdbc:mariadb://localhost:3306/client_project
当我运行主类时,我得到这个输出:
url constructor : null
url postconstruct : jdbc:mariadb://localhost:3306/client_project
Main : jdbc:mariadb://localhost:3306/client_project
当 spring 调用此构造函数时, url 属性为 null !如果@Value必须在实例化 bean 之前读取属性,则必须设置 url 并且与 null 不同。
不是吗?
我的代码有问题吗?还是我对bean生命周期的理解?
弑天下
相关分类