我的类文件正在初始化,可能是因为我有一个@bean用于同一个类,但位于不同的.java文件中

我的类文件正在初始化,可能是因为我有一个@bean用于同一个类,但位于不同的.java文件中,java,spring,Java,Spring,我不熟悉spring和annotations。 我在调试模式下启动了应用程序,我发现当我的代码达到执行器的init()方法时,低于分配给actVar1和actVar2的值 actVar1具有“abc”值 actVar2具有“xyz”值 注意:我的应用程序尚未完全启动。我只是为了一个不同的目的在init()方法中尝试调试点,我观察到了上面的情况 我的问题是为什么这些变量分配了这些值 //Actuator.java @Component public class Actuator { privat

我不熟悉spring和annotations。 我在调试模式下启动了应用程序,我发现当我的代码达到执行器的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
注释的方法将自动执行,我假设这发生在您希望它发生之前的某个时间点

要声明bean,只需使用@bean注释对方法进行注释。当JavaConfig遇到这样一个方法时,它将执行该方法并将返回值注册为BeanFactory中的bean

您可以使用
@DependsOn
注释来控制bean创建顺序:

默认情况下,Spring管理bean的生命周期并安排它们的初始化顺序

但是,我们仍然可以根据需要定制它。我们可以选择SmartLifeCycle接口或@DependsOn注释来管理初始化顺序

我们应该使用这个注释来指定bean依赖项。Spring保证在尝试初始化当前bean之前,将初始化已定义的bean

请阅读有关在本文档中使用此批注的详细信息

我的问题是为什么这些变量分配了这些值

首先,在Spring创建一个bean之后,它将调用该bean的
@PostConstruct
方法

其次,Spring将为以下情况创建一个bean:

  • 如果一个类由
    @组件
    或其组件(如
    @存储库
    @服务
    、和
    @控制器
    等)进行注释,并且对包含该类的包启用了自动扫描功能,它将为该类创建一个bean

  • 如果
    @Configuration
    /
    @Component
    类上的方法用
    @Bean
    注释,Spring将

因此,您的示例创建了两个bean,类型为
exactor
。A是由于
执行器
类上的
@组件
,而B是由于
BeanCreator.exactor()
上的
@Bean
方法。这就是为什么您会看到
init()
执行两次,因为有两个
执行器
Bean。对于A,它的
init()
以NULL执行。对于B,它的
init()
是用“abc”和“xyz”执行的,因为您在创建它的
@Bean
方法中设置了它