【问题标题】:Does calling @Bean methods create a new instance of the object or the bean instance?调用 @Bean 方法是否会创建对象或 bean 实例的新实例?
【发布时间】:2016-03-18 07:04:36
【问题描述】:

在下面的代码中,是否使用Bar 的两个不同实例在foo.setBar(bar())blah.setBar(bar()) 内调用bar()?还是使用a bean instanceBar 代替?如果是 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;
    }
}

【问题讨论】:

    标签: java spring


    【解决方案1】:

    Spring 会为您的 @Configuration 注释类创建一个代理。该代理拦截@Bean 方法调用并缓存bean 实例,以便进一步调用相同@Bean 方法引用相同的bean 实例。

    因此,在您的情况下,对 bar() 方法的两个调用都引用同一个 Bar 实例。 Bar 实例实际上是每个应用程序上下文的单例。这就是为什么 @Bean 方法的可见性仅限于 protected 、 package 或 public 因为Spring 需要在代理中覆盖你的 @Bean 方法。

    【讨论】:

      【解决方案2】:

      将使用单个 bean 实例,它是使用代理实现的。 Spring 使用 基于继承的代理 的概念来实现这一点。请看一下-How to exactly work the Spring Inheritance-based Proxies configuration?

      【讨论】:

        【解决方案3】:

        在您的情况下将使用相同的 bean 实例,因为“@Bean”注释默认使用单例范围。

        是的,这是通过 spring 代理内部实现的。

        【讨论】:

          猜你喜欢
          • 2018-02-02
          • 2012-10-07
          • 1970-01-01
          • 2014-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多