为什么这种基于Java的Spring配置创建一个单例bean的两个实例?

巴特·斯威南惠斯

当我将带@Configuration注释的类类化并将其提供给AnnotationConfigApplicationContext

下面的这些类概述了该方案。这是完整的来源

public class Bar {}

public class Foo {
    private Bar bar;
    public Foo(Bar bar) { this.bar = bar; }
    @Override public String toString() {
        return super.toString() + "(" + bar + ")"; 
    }
}

@Configuration
public class BaseAppConfig {
    @Bean public Foo foo() { return new Foo(bar()); }
    @Bean public Bar bar() { return new Bar(); }
}

/** Omitting @Configuration here */
public class AppConfig extends BaseAppConfig {
    @Bean @Override public Bar bar() { return new Bar(); }
}

public class App {
    public static void main(String[] args) {
        try (AnnotationConfigApplicationContext ctx = new
                 AnnotationConfigApplicationContext(AppConfig.class)) {
            System.out.println(ctx.getBean(Foo.class).toString());
            System.out.println(ctx.getBean(Bar.class).toString());
        }
    }
}

这将打印两个Bar实例,我希望两次看到相同的实例:

Foo@3e9b1010(Bar@6c3708b3)
Bar@6f1fba17
Sotirios Delimanolis

因为您省略了@Configuration注释(并且不是@Inherited

/** Omitting @Configuration here */
public class AppConfig extends BaseAppConfig { 

在指定类别 AnnotationConfigApplicationContext

AnnotationConfigApplicationContext ctx = new
             AnnotationConfigApplicationContext(AppConfig.class)

将其标记为常规bean类,而不是@Configurationbean类。

这意味着@Bean方法在精简模式下运行。

@Configuration类中bean方法的语义相反,精简模式不支持“ bean间引用”。相反,当一种@Bean方法@Bean在精简模式下调用另一种方法时,该调用是标准Java方法调用;Spring不会通过CGLIB代理拦截调用。这类似于内部@Transactional方法调用,在代理模式下,Spring不会拦截调用-Spring仅在AspectJ模式下会拦截调用。

强调我的。这意味着该bar()呼叫

return new Foo(bar());

实际上只是bar()再次调用,它没有返回创建的旧实例。

@Configuration通过让Spring创建带注释的类代理工作,该代理将缓存@Bean工厂方法返回的实例既然您已经删除了@Configuration,Spring将不会应用此缓存,并且方法调用将正常工作,在这种情况下,您将返回一个新实例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

单例返回两个实例

来自分类Dev

为什么在Spring MVC应用程序中创建两个Spring bean控制器实例?

来自分类Dev

为什么在使用python单例模式时只实现最后一个实例

来自分类Dev

为什么我的代码使用两个实例而不是一个?

来自分类Dev

Python,为什么我的for循环在创建一个docx文件时会创建两个?

来自分类Dev

PHP CRUD 上的两个单例实例

来自分类Dev

为什么此符号链接创建两个实例

来自分类Dev

为什么重启后会创建两个活动实例?

来自分类Dev

为什么在一个配置中声明的覆盖Spring bean在另一个配置中被允许?

来自分类Dev

为什么有两个“Okular”实例,我如何摆脱另一个实例?

来自分类Dev

重新创建一个基于shared_ptr的单例

来自分类Dev

Scala脚本引擎创建单例的另一个实例

来自分类Dev

Guice:在创建模块之前实例化一个单例

来自分类Dev

Scala脚本引擎创建单例的另一个实例

来自分类Dev

无法确保仅以单例模式创建一个实例

来自分类Dev

是否可以创建一个维护实例字典的单例工厂类?

来自分类Dev

如何实例化一个单例

来自分类Dev

为什么 sys.getsizeof() 为两个实例报告相同的大小,即使一个实例有一个额外的属性?

来自分类Dev

Java / SQL创建自定义序列/基于两个序列创建一个序列

来自分类Dev

如何创建一个在春季创建单例的工厂

来自分类Dev

如何创建一个在春季创建单例的工厂

来自分类Dev

为什么performSegueWithIdentifier总是创建一个新实例?

来自分类Dev

为什么不能将单例方法附加到另一个对象?

来自分类Dev

为什么不能将单例方法附加到另一个对象?

来自分类Dev

一个用户基于别名的两个不同的vim配置?

来自分类Dev

为什么只有这两个用于创建绣花的smilar宏中的一个起作用?

来自分类Dev

Kendo的ToDataSourceResult为什么为一个查询创建两个ADO.Net调用

来自分类Dev

当我有两个 Worker 节点时,为什么 Spark Standalone 只创建一个 Executor?

来自分类Dev

如何使用基于Java的配置创建两个http安全配置?

Related 相关文章

  1. 1

    单例返回两个实例

  2. 2

    为什么在Spring MVC应用程序中创建两个Spring bean控制器实例?

  3. 3

    为什么在使用python单例模式时只实现最后一个实例

  4. 4

    为什么我的代码使用两个实例而不是一个?

  5. 5

    Python,为什么我的for循环在创建一个docx文件时会创建两个?

  6. 6

    PHP CRUD 上的两个单例实例

  7. 7

    为什么此符号链接创建两个实例

  8. 8

    为什么重启后会创建两个活动实例?

  9. 9

    为什么在一个配置中声明的覆盖Spring bean在另一个配置中被允许?

  10. 10

    为什么有两个“Okular”实例,我如何摆脱另一个实例?

  11. 11

    重新创建一个基于shared_ptr的单例

  12. 12

    Scala脚本引擎创建单例的另一个实例

  13. 13

    Guice:在创建模块之前实例化一个单例

  14. 14

    Scala脚本引擎创建单例的另一个实例

  15. 15

    无法确保仅以单例模式创建一个实例

  16. 16

    是否可以创建一个维护实例字典的单例工厂类?

  17. 17

    如何实例化一个单例

  18. 18

    为什么 sys.getsizeof() 为两个实例报告相同的大小,即使一个实例有一个额外的属性?

  19. 19

    Java / SQL创建自定义序列/基于两个序列创建一个序列

  20. 20

    如何创建一个在春季创建单例的工厂

  21. 21

    如何创建一个在春季创建单例的工厂

  22. 22

    为什么performSegueWithIdentifier总是创建一个新实例?

  23. 23

    为什么不能将单例方法附加到另一个对象?

  24. 24

    为什么不能将单例方法附加到另一个对象?

  25. 25

    一个用户基于别名的两个不同的vim配置?

  26. 26

    为什么只有这两个用于创建绣花的smilar宏中的一个起作用?

  27. 27

    Kendo的ToDataSourceResult为什么为一个查询创建两个ADO.Net调用

  28. 28

    当我有两个 Worker 节点时,为什么 Spark Standalone 只创建一个 Executor?

  29. 29

    如何使用基于Java的配置创建两个http安全配置?

热门标签

归档