Я пытаюсь создать компонент и создать экземпляр свойства компонента, переопределяющего конструктор по умолчанию и использующий объект Environment [org.springframework.core.env.Environment] для получения и назначения свойств из файла свойств.
Ниже находится мой файл свойств [mi.properties]
mi.name=GB
mi.grade=13
Ниже приведен мой класс бобов
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;
}
}
Это создаст Школьный бин правильно. Однако, когда я пытаюсь автоматически связать среду в школьном компоненте, он не создает компонент.
Ниже я попробовал
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;
}
}
Это не создает School bean в контексте Spring, и когда я отлаживал, экземпляр Environment внутри переопределенного конструктора по умолчанию имеет значение null , следовательно, getProperty () метод терпит неудачу.
Я немного запутался в этом.
Согласно моему пониманию, контекст жизненного цикла Spring будет автоматически связывать все свойства @autowired перед вызовом конструктора. Это правильно?
Если приведенное выше утверждение неверно, когда все свойства автопроводки разрешены в жизненном цикле весны?
Согласно архитектуре JVM, он выделяет память и присваивает значение по умолчанию свойствам класса, когда класс загружается впервые. Означает ли это, что по умолчанию, когда School class загружен, его свойство env по умолчанию имеет значение null?
Как работает автоматическая среда в классе JavaConfig? Как Spring автоматически связывает эти значения и на какой стадии своего жизненного цикла?
Как предлагалось на некоторых форумах, я попытался реализовать интерфейс EnvironmentAware в School class и добавил аннотацию @Component к School class.Still Нет результата.