调用@Bean方法是否会创建对象或bean实例的新实例?

时间:2016-03-18 07:04:36

标签: java spring

在下面的代码中,使用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;
    }
}

3 个答案:

答案 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”注释使用单例范围。

是的,它是由春天代理内部人员实现的。