Я новичок в 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 на другое, эти значения не назначаются.
Согласно официальной документации 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-компонент для следующих случаев:
Если класс аннотирован @Component
или его аннотация стереотипа, например @Repository
, @Service
, @Controller
и т. д., и для пакета, содержащего этот класс, включена функция автоматического сканирования, для него будет создан bean-компонент.
Если метод класса @Configuration
/@Component
помечен @Bean
, Spring будет вызовите этот метод для создания bean-компонента.
Итак, ваш пример создает 2 bean-компонента типа Actuator
. A связано с @Component
в классе Actuator
, а B связано с @Bean
методом в BeanCreator.actuator()
. Вот почему вы видите, что init()
выполняется два раза, поскольку есть два Actuator
bean-компонента. Для A его init()
выполняется с NULL. Для B его init()
выполняется с «abc» и «xyz» просто потому, что вы установили его в методе @Bean
, который его создает.