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使用基于继承的代理的概念来实现这一点。请看一看-