Java 调用@Bean方法是创建对象的新实例还是Bean实例?
在下面的代码中,正在使用Java 调用@Bean方法是创建对象的新实例还是Bean实例?,java,spring,Java,Spring,在下面的代码中,正在使用bar的两个不同实例在foo.setBar(bar())和blah.setBar(bar())内部调用bar()?或者它是使用条的bean实例?如果它是一个bean实例,Spring是如何自动完成的?它是通过代理实现的吗 @Configuration public class AppConfig { @Bean public Foo foo() { Foo foo = new Foo(); foo.setBar(bar())
bar
的两个不同实例在foo.setBar(bar())
和blah.setBar(bar())
内部调用bar()
?或者它是使用条的bean实例?如果它是一个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;
}
}
在您的案例中将使用相同的bean实例,因为默认情况下,'@bean'注释使用单例作用域
是的,它是通过spring代理内部实现的。spring创建@Configuration注释类的代理。这个代理拦截@Bean方法调用并缓存Bean实例,以便对同一@Bean方法的进一步调用引用同一Bean实例
因此,在您的例子中,对bar()方法的两个调用都引用同一个bar实例。bar实例实际上是每个应用程序上下文的一个单例。这就是为什么@Bean方法可见性被限制为受保护,因为Spring需要覆盖代理中的@Bean方法。将使用单个Bean实例,它是通过代理实现的。Spring使用基于继承的代理的概念来实现这一点。请看一看-