Мои поля классов инициализируются, возможно, потому, что у меня есть @bean для того же класса, но в другом файле .java

Я новичок в spring и аннотациях. Я запустил приложение в режиме отладки и обнаружил, что к тому времени, когда мой код достигает метода init() актуатора, значения ниже были назначены для actVar1 и actVar2.

actVar1 имеет значение "abc"

actVar2 имеет значение "xyz"

Примечание. Мое приложение еще не запущено полностью. Я просто пытаюсь использовать точку отладки в методе init() для другой цели, и я заметил выше.

Мой вопрос в том, почему эти переменные присвоили эти значения.

//Actuator.java 
@Component
public class Actuator {
private String actVar1;
private String actVar2;
//.. some code here
@PostConstruct
public void init(){
//my debug point is here 
//some code .....
}
//.. some code here

}
//Beancreator.java
@Component
public class BeanCreator {
//.. some code here
private String first = "abc";
private field2 second  = "xyz";
//.. some code here

@Bean 
public Actuator actuator() { 
Actuator actuator = new Actuator(); 
actuator.setActVar1(first); 
actuator.setActVar2(second); 
return actuatorPoller; 
} 
//.. some code here
}

Когда я меняю имя метода в @Bean на другое, эти значения не назначаются.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Согласно официальной документации Spring, методы, аннотированные @Bean, будут выполняться автоматически, и я предполагаю, что это происходит в определенный момент времени, прежде чем вы хотели бы, чтобы это произошло.

To declare a bean, simply annotate a method with the @Bean annotation. When JavaConfig encounters such a method, it will execute that method and register the return value as a bean within a BeanFactory.

Вы можете использовать аннотацию @DependsOn для управления порядком создания компонентов:

Spring, by default, manages beans’ lifecycle and arranges their initialization order.

But, we can still customize it based on our needs. We can choose either the SmartLifeCycle interface or the @DependsOn annotation for managing initialization order.

We should use this annotation for specifying bean dependencies. Spring guarantees that the defined beans will be initialized before attempting an initialization of the current bean.

Узнайте больше об использовании этой аннотации в этом статья.

Ответ принят как подходящий

My question is why those variables have assigned those values ?

Во-первых, после того, как Spring создаст bean-компонент, он вызовет метод @PostConstruct этого bean-компонента.

Во-вторых, Spring создаст bean-компонент для следующих случаев:

Итак, ваш пример создает 2 bean-компонента типа Actuator. A связано с @Component в классе Actuator, а B связано с @Bean методом в BeanCreator.actuator(). Вот почему вы видите, что init() выполняется два раза, поскольку есть два Actuator bean-компонента. Для A его init() выполняется с NULL. Для B его init() выполняется с «abc» и «xyz» просто потому, что вы установили его в методе @Bean, который его создает.

Другие вопросы по теме