我的类文件正在初始化,可能是因为我有一个@bean用于同一个类,但位于不同的.java文件中
我不熟悉spring和annotations。 我在调试模式下启动了应用程序,我发现当我的代码达到执行器的init()方法时,低于分配给actVar1和actVar2的值 actVar1具有“abc”值 actVar2具有“xyz”值 注意:我的应用程序尚未完全启动。我只是为了一个不同的目的在init()方法中尝试调试点,我观察到了上面的情况 我的问题是为什么这些变量分配了这些值我的类文件正在初始化,可能是因为我有一个@bean用于同一个类,但位于不同的.java文件中,java,spring,Java,Spring,我不熟悉spring和annotations。 我在调试模式下启动了应用程序,我发现当我的代码达到执行器的init()方法时,低于分配给actVar1和actVar2的值 actVar1具有“abc”值 actVar2具有“xyz”值 注意:我的应用程序尚未完全启动。我只是为了一个不同的目的在init()方法中尝试调试点,我观察到了上面的情况 我的问题是为什么这些变量分配了这些值 //Actuator.java @Component public class Actuator { privat
//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
注释的方法将自动执行,我假设这发生在您希望它发生之前的某个时间点
要声明bean,只需使用@bean注释对方法进行注释。当JavaConfig遇到这样一个方法时,它将执行该方法并将返回值注册为BeanFactory中的bean
您可以使用@DependsOn
注释来控制bean创建顺序:
默认情况下,Spring管理bean的生命周期并安排它们的初始化顺序
但是,我们仍然可以根据需要定制它。我们可以选择SmartLifeCycle接口或@DependsOn注释来管理初始化顺序
我们应该使用这个注释来指定bean依赖项。Spring保证在尝试初始化当前bean之前,将初始化已定义的bean
请阅读有关在本文档中使用此批注的详细信息
我的问题是为什么这些变量分配了这些值
首先,在Spring创建一个bean之后,它将调用该bean的@PostConstruct
方法
其次,Spring将为以下情况创建一个bean:
- 如果一个类由
或其组件(如@组件
、@存储库
、和@服务
等)进行注释,并且对包含该类的包启用了自动扫描功能,它将为该类创建一个bean@控制器
- 如果
/@Configuration
类上的方法用@Component
注释,Spring将@Bean
exactor
。A是由于执行器
类上的@组件
,而B是由于BeanCreator.exactor()
上的@Bean
方法。这就是为什么您会看到init()
执行两次,因为有两个执行器
Bean。对于A,它的init()
以NULL执行。对于B,它的init()
是用“abc”和“xyz”执行的,因为您在创建它的@Bean
方法中设置了它