1 回答
TA贡献1884条经验 获得超4个赞
类@Configuration不会在每次一个注解为 的方法@Bean调用另一个注解为 的方法时实例化一个新对象@Bean。考虑这个例子:
@Configuration
public class TestConfig {
@Bean
public String bean2(){
String bean = bean1("bean2");
System.out.println("bean2: " + bean);
return bean;
}
@Bean
public String bean3(){
String bean = bean1("bean3");
System.out.println("bean3: " + bean);
return bean;
}
@Bean
public String bean1(@Autowired(required = false) String name){
System.out.println("bean1 " + name);
return name;
}
}
输出如下,因为bean2()是先执行的:
bean1 bean2
bean2: bean2
bean3: bean2
这是相关文件:
换句话说,当您定义一个 bean 定义并将其限定为单例时,Spring IoC 容器会创建该 bean 定义定义的对象的一个实例。这个单个实例存储在此类单例 bean 的缓存中,并且对该命名 bean 的所有后续请求和引用都返回缓存的对象。下图显示了单例作用域的工作原理:
在这种情况下,注释为的方法@Bean
是一个 bean 定义。
还:
所有 @Configuration 类都在启动时使用 CGLIB 进行子类化。在子类中,子方法在调用父方法并创建新实例之前首先检查容器中是否有任何缓存的(范围内的)bean。
换句话说,@Bean
无论参数如何,每次调用带注释的方法都应该返回相同的 bean。depends-on
在您的情况下,我认为它是未定义的行为,因为除非您使用or之类的选项,否则不能保证实例化的顺序SmartLifecycle
。
添加回答
举报