我正在尝试创建一个 bean 并实例化 bean 属性,覆盖默认构造函数,并使用环境 [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 中 Autowiring 环境时,它并没有创建 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,当我调试时,重写的默认构造函数内的环境实例为 null 因此 getProperty() 方法失败。
我对此有点困惑。
根据我的理解,Spring 生命周期上下文会在构造函数调用之前 Autowiring 所有 @autowired 属性。正确吗?
当所有 Autowiring 的属性都在 Spring 生命周期中解析时,上述说法是否错误?
根据 JVM 体系结构,首次加载类时,它会分配内存并为类的属性分配默认值。这是否意味着默认情况下,当加载 School 类时,其属性 env 默认为 null ?
JavaConfig 类中的 Autowiring 环境如何工作? Spring 如何 Autowiring 这个值以及在其生命周期的哪个阶段?
block 引用>As suggested in some forums I have tried implementing EnvironmentAware interface in School class and added @Component annotation to School class.Still No result.
最佳答案
Spring 在执行构造函数并创建实例后使用反射注入(inject) @Autowired
属性。这就是为什么你总是在构造函数中得到 null - Spring 还没有设置类的属性。
您可以通过多种方式实现您想要的目标。一种是使用
afterPropertiesSet()
方法,按照名称所示在设置属性后执行:)在那里你将有 env
我更喜欢的另一种解决方案是在构造函数中添加 Autowiring 的 bean。有些人称之为构造函数注入(inject)。
它将使用环境将构造函数标记为 Autowiring (或者只有一个构造函数):
@Autowired
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);
}
这样您还可以将环境变量设置为最终变量(这是一个好主意)。正如其他人所建议的那样,这将与 @component 注释一起使用,以便删除使用 new School()
检查这个link了解更多
关于java - Autowired 在 Bean 类 Spring 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50002903/