我的类文件正在初始化可能是因为我有一个用于同一类但在不同的

我是 spring 和注释的新手。我在调试模式下启动应用程序,我发现当我的代码到达 Actuator 的 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 下的方法名称更改为不同的方法名称时,这些值不会被分配。


一只萌萌小番薯
浏览 82回答 2
2回答

www说

我的问题是为什么那些变量分配了那些值?首先,Spring 创建一个 bean 之后,它会调用那个 bean 的@PostConstruct方法。其次,Spring会为以下情况创建一个bean:如果一个类被注解@Component或者它的构造型注解如@Repository, @Service, 和@Controlleretc ,并且为包含该类的包启用自动扫描功能,它将为它创建一个 bean。如果@Configuration/ @Componentclass 上的方法被注解@Bean,Spring 将调用该方法来创建一个 bean。因此,您的示例创建了 2 个类型为Actuator. A 归因于@ComponentonActuator类,而 B 归因于@Bean方法 on BeanCreator.actuator()。这就是为什么您会看到init()执行两次,因为有两个Actuatorbean。对于 A ,它init()是用 NULL 执行的。对于 B,它init()是用“abc”和“xyz”执行的,只是因为您在@Bean创建它的方法中设置了它。

神不在的星期二

根据 Spring 的官方文档,注释为的方法@Bean将自动执行,我假设这发生在您希望它发生之前的某个时间点。要声明一个 bean,只需使用 @Bean 注释来注释一个方法。当 JavaConfig 遇到这样的方法时,它将执行该方法并将返回值注册为 BeanFactory 中的 bean。您可以使用@DependsOn注释来控制 bean 创建顺序:默认情况下,Spring 管理 bean 的生命周期并安排它们的初始化顺序。但是,我们仍然可以根据需要自定义它。我们可以选择 SmartLifeCycle 接口或 @DependsOn 注释来管理初始化顺序。我们应该使用此注释来指定 bean 依赖项。Spring 保证在尝试初始化当前 bean 之前将初始化定义的 bean。在本文中阅读有关此注释的使用的更多信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java