【发布时间】:2018-10-04 18:53:33
【问题描述】:
我正在尝试创建一个 bean 并实例化覆盖默认构造函数的 bean 属性,并使用 Environment [org.springframework.core.env.Environment] 的对象从属性文件中获取和分配属性。
下面是我的属性文件 [mi.properties]
mi.name=GB
mi.grade=13
下面是我的简单 bean 类
public class School implements EnvironmentAware {
private String schoolName;
private int schoolGrade;
private int totalStudents;
public School(Environment env) {
this.schoolName = env.getProperty("mi.name", "MT");
this.schoolGrade = env.getProperty("mi.grade", Integer.class, 10);
this.totalStudents = env.getProperty("mi.total", Integer.class, 1000);
}
public School() {
this.schoolName = this.env.getProperty("mi.name", "MT");
this.schoolGrade = this.env.getProperty("mi.grade", Integer.class, 10);
this.totalStudents = this.env.getProperty("mi.total", Integer.class, 1000);
}
//Getter Setters
}
下面是我的 Java 配置类
@Configuration
@PropertySource("classpath:/cross/mi.properties")
public class JavaConfig {
@Autowired
private Environment env;
@Bean
public School getSchool()
{
School obj = new School(env);
return obj;
}
}
这将正确地创建 School bean。但是,当我尝试在 School bean 中自动装配 Environment 时,它并没有创建 bean。
以下是我尝试过的
public class School implements EnvironmentAware {
private String schoolName;
private int schoolGrade;
private int totalStudents;
@Autowired
private Environment env;
public School(Environment env) {
this.schoolName = env.getProperty("mi.name", "MT");
this.schoolGrade = env.getProperty("mi.grade", Integer.class, 10);
this.totalStudents = env.getProperty("mi.total", Integer.class, 1000);
}
public School() {
this.schoolName = this.env.getProperty("mi.name", "MT");
this.schoolGrade = this.env.getProperty("mi.grade", Integer.class, 10);
this.totalStudents = this.env.getProperty("mi.total", Integer.class, 1000);
}
//Getter Setters
}
Java 配置更改如下
@Configuration
@PropertySource("classpath:/cross/mi.properties")
@ComponentScan
public class JavaConfig {
@Bean
public School getSchool()
{
School obj = new School();
return obj;
}
}
这不是在 Spring 上下文中创建 School bean,当我调试时,覆盖的默认构造函数中的 Environment 实例是 null 因此 getProperty() 方法失败。
我对此有点困惑。
据我了解,Spring 生命周期上下文将在构造函数调用之前自动装配所有 @autowired 属性。对吗?
如果在 Spring 生命周期中解决所有自动装配的属性时上述语句错误?
根据 JVM 架构,它会在第一次加载类时分配内存并为类的属性分配默认值。这是否意味着默认加载 School 类时,其属性 env 默认为 null ?
JavaConfig 类中的自动装配环境如何工作? Spring 如何自动装配此值以及在其生命周期的哪个阶段?
正如一些论坛所建议的,我已经尝试在 School 类中实现 EnvironmentAware 接口,并将@Component 注释添加到 School 类。仍然没有结果。
【问题讨论】:
标签: java spring inversion-of-control autowired