java - Autowired 在 Bean 类 Spring 中不起作用

标签 java spring inversion-of-control autowired

我正在尝试创建一个 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() 方法失败。

我对此有点困惑。

  1. 根据我的理解,Spring 生命周期上下文会在构造函数调用之前 Autowiring 所有 @autowired 属性。正确吗?

  2. 当所有 Autowiring 的属性都在 Spring 生命周期中解析时,上述说法是否错误?

  3. 根据 JVM 体系结构,首次加载类时,它会分配内存并为类的属性分配默认值。这是否意味着默认情况下,当加载 School 类时,其属性 env 默认为 null ?

  4. JavaConfig 类中的 Autowiring 环境如何工作? Spring 如何 Autowiring 这个值以及在其生命周期的哪个阶段?

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()

手动创建 bean

检查这个link了解更多

关于java - Autowired 在 Bean 类 Spring 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50002903/

相关文章:

Java决策问题

java - 如何在运行时从类类型实例化一个类?

java - 如何访问 jar 中的配置文件?

mysql - 在域对象约束中指定grails浮点精度,如何?

c# - 使用带结构图的命名 session 实例策略的 Setter 剖分

java - 根据名称查找子目录和目录

java - 将类强制转换为 Spring 中的接口(interface)

spring - Struts 和 Spring 一起吗?

dependency-injection - 使用第三方库时如何应用依赖倒置原则?

php - DI容器和定制的MVC