我正在做我的日常工作人员而且我已经意识到尽管我经常使用@Configuration我不知道它是如何工作的,在阅读了spring.io文件后我无法确定@Configuration是否是一种方式把班级变成单身人士。
所以....我想我的问题是:
我应该使用什么来正确制作单身@Configuration或@Component?为什么那个'?
我一直在调查这两个选项,其中包括两个例子:
第一个例子
@Configuration
public static class Config {
@Bean
public SimpleBean simpleBean() {
return new SimpleBean();
}
@Bean
public SimpleBeanConsumer simpleBeanConsumer() {
return new SimpleBeanConsumer(simpleBean());
}
}
第二个例子
@Component
public static class Config {
@Bean
public SimpleBean simpleBean() {
return new SimpleBean();
}
@Bean
public SimpleBeanConsumer simpleBeanConsumer() {
return new SimpleBeanConsumer(simpleBean());
}
}
第一段代码工作正常,正如预期的那样,SimpleBeanConsumer将获得单例SimpleBean的链接。但不幸的是,它在签署的环境中无效。
第二个配置完全不正确,因为spring将创建SimpleBean的单例bean,但SimpleBeanConsumer将获取另一个SimpleBean实例,该实例不在spring上下文控件中。
此行为的原因可以解释如下:
如果使用@Configuration,标记为@Bean的所有方法都将被包装到CGLIB包装器中,该包装器就像是第一次调用此方法一样,然后将执行原始方法的主体,并将结果对象注册到春天的背景。所有进一步的调用只返回从上下文中检索的bean。
所以我想我已经回答了我自己的问题,但不确定我是否遗漏了什么。