【问题标题】:spring singleton scope-- per container per bean弹簧单例范围 - 每个容器每个 bean
【发布时间】:2012-10-16 15:22:58
【问题描述】:

我问这个问题是针对我的问题:

spring singleton scope

Spring 单例在参考手册中被定义为per container per bean

每个容器表示如果我们喜欢:

ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml")
MyBean myobj=(MyBean)context.getBean("myBean"); //myBean is of singleton scope.
MyBean myobj1=(MyBean)context.getBean("myBean");

Beans.xml:

<bean id="myBean" class="MyBean"/>

然后myobj==myobj1 将变为true。表示两者都指向相同的实例

对于短语 per container per beanper bean 部分,我有些困惑。我对 per bean 的关注是否正确:

如果我们喜欢

ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml")
MyBean myobj=(MyBean)context.getBean("myBean"); 
MyBean myobj1=(MyBean)context.getBean("mySecondBean");

Beans.xml:

<bean id="myBean" class="MyBean"/>
<bean id="mySecondBean" class="MyBean"/>

那么myobj==myobj1 就会变成假的。意味着它们是两个不同的实例

【问题讨论】:

    标签: java spring


    【解决方案1】:

    没错。

    如果有帮助,您还可以将 Spring bean 视为您可以使用构造函数在 Java 代码中手动创建的实例。

    通过在 Spring XML 文件中定义 bean,该 bean(实例)注册到 Spring 的 App Context,然后该实例可以传递到代码的其他区域。

    通过创建一个新 bean,您实际上是在创建一个新实例。因此,您可能可以创建任意数量的同一类的 bean(实例)

    【讨论】:

    • @a-Learner 尝试在您的类构造函数中添加调试点。当您启动应用程序进行调试时,您将看到调试点被命中的次数与您拥有该类的 bean 的次数一样多。
    【解决方案2】:

    myBean 是一个 Spring 单例,因为每次调用 beans.getBean("myBean") 都会返回相同的实例。而具有不同 id 的 mySecondBean 是另一个 Spring 单例。您可以在同一个 ApplicationContext 中拥有同一类的不同单例 bean。

    【讨论】:

      【解决方案3】:

      是的,你是对的。测试它会告诉你。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-16
        • 1970-01-01
        • 2013-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-13
        相关资源
        最近更新 更多