在下面的代码中,使用bar()
的两个差异实例在foo.setBar(bar())
和blah.setBar(bar())
内调用Bar
?或者是使用a bean instance
代替Bar
?如果它是一个bean实例,Spring如何自动完成?它是通过代理实现的吗?
@Configuration
public class AppConfig {
@Bean
public Foo foo() {
Foo foo = new Foo();
foo.setBar(bar());
return foo;
}
@Bean
public Bar bar() {
return new Bar();
}
@Bean
public Blah blah() {
Blah blah = new Blah();
blah.setBar(bar());
return blah;
}
}
答案 0 :(得分:3)
Spring创建@Configuration注释类的代理。此代理拦截@Bean方法调用并缓存bean实例,以便对同一个@Bean方法的进一步调用引用相同的bean实例。
因此,在您的情况下,对bar()方法的两次调用都引用相同的Bar实例.Bar实例实际上是每个应用程序上下文的单例。这就是为什么@Bean方法可见性仅限于protected,package或public,因为Spring需要覆盖代理中的@Bean方法。
答案 1 :(得分:1)
将使用单个bean实例,并使用代理实现。 Spring使用基于继承的代理的概念来实现这一目标。请看一下 - How to exactly work the Spring Inheritance-based Proxies configuration?
答案 2 :(得分:0)
在您的情况下将使用相同的bean实例,因为默认情况下对“@Bean”注释使用单例范围。
是的,它是由春天代理内部人员实现的。