为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只萌萌小番薯 2022-12-15 16:10:30
我是 spring 和注释的新手。我在调试模式下启动应用程序,我发现当我的代码到达 Actuator 的 init() 方法时,以下值已分配给 actVar1 和 actVar2。actVar1 具有“abc”值actVar2 具有“xyz”值注意:我的应用程序还没有完全启动。我只是出于不同的目的尝试在 init() 方法中使用调试点,并且我观察到了上述情况。我的问题是为什么这些变量分配了这些值。//Actuator.java @Componentpublic class Actuator {private String actVar1;private String actVar2;//.. some code here@PostConstructpublic void init(){//my debug point is here //some code .....}//.. some code here}//Beancreator.java@Componentpublic class BeanCreator {//.. some code hereprivate 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 下的方法名称更改为不同的方法名称时,这些值不会被分配。
查看完整描述

2 回答

?
www说

TA贡献1775条经验 获得超8个赞

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

首先,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创建它的方法中设置了它。


查看完整回答
反对 回复 2022-12-15
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

根据 Spring 的官方文档,注释为的方法@Bean将自动执行,我假设这发生在您希望它发生之前的某个时间点。

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

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

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

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

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

在本文中阅读有关此注释的使用的更多信息。


查看完整回答
反对 回复 2022-12-15
  • 2 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信