Spring Singleton范围的确切含义是什么?

时间:2015-04-17 01:25:24

标签: spring spring-ioc

我为applicationContext.xml中具有不同id名称的同一个类定义了两个bean。它工作得很好,所以我混淆了确切的弹簧单件范围意味着什么。我的代码如下。我在stackoverflow中经历了一些其他类似的问题。但我不清楚,因为那些不完全相同的背景和很长的解释。

如果您知道它是什么,请与我分享

我读到了这一点   1.容器的单个实例(上下文),
       - 就我而言,是否为我的两个实例创建了两个容器?                                     

<bean id="a2" class="com.myapp.Address">
    <constructor-arg value="Delhi"></constructor-arg>
    <constructor-arg value="DOWN"></constructor-arg>
    <constructor-arg value="India"></constructor-arg>
</bean>


<bean id="e" class="com.myapp.Employee">
    <constructor-arg value="12" type="int"></constructor-arg>
    <constructor-arg value="Sonoo"></constructor-arg>
    <constructor-arg>
        <ref bean="a1" />
    </constructor-arg>
</bean>

<bean id="e2" class="com.myapp.Employee">
    <constructor-arg value="12" type="int"></constructor-arg>
    <constructor-arg value="Sonoo"></constructor-arg>
    <constructor-arg>
        <ref bean="a2" />
    </constructor-arg>
</bean>

4 个答案:

答案 0 :(得分:1)

Singleton Scoped bean很简单:每个bean实际上是在容器中实例化的一个对象(也就是应用程序上下文)。

在您的示例中,Spring容器将创建2个Employee个对象(也称为Beans),分别为ee1

其他范围有点棘手。可以为bean实例化多个对象。例如,如果您使用原型范围定义了bean,那么无论何时从容器中查找该bean,容器都将实例化一个新的对象实例。对于其他范围,它是类似的:容器将在特定时间创建一个新实例(例如,请求范围将导致为每个传入请求创建一个bean等)。


请注意:请勿将此Singleton与Singleton Design模式混淆。除了&#34; Only-one&#34;它们没有任何共同之处。特性。 Singleton Design Pattern具有许多其他特性(例如全局可用的查找方法;整个进程空间中只有一个实例;不允许显式实例化等),这与Spring的Singleton范围无关

答案 1 :(得分:0)

Spring单例范围意味着spring容器仅为不同实例的同一类创建一个对象。

例如,在您的代码中,如果您没有将值注入到员工的e2对象中,并且如果您尝试为e和e2打印两个员工类的值,则两者都将提供相同的输出。

(如果您在同一XML文件中引用bean,则可以使用<ref local=""/>而不是ref bean)

<bean id="e" class="com.myapp.Employee">
    <constructor-arg value="12" type="int"></constructor-arg>
    <constructor-arg value="Sonoo"></constructor-arg>
    <constructor-arg>
        <ref local="a1"/>
    </constructor-arg>
</bean>

<bean id="e2" class="com.myapp.Employee">
    <constructor-arg>
        <ref local ="a2" />
    </constructor-arg>
</bean>

在上述情况下,e和e2的员工价值分别为12和Sonoo。

答案 2 :(得分:0)

  • Singleton是春季的默认范围,即每个容器一个bean(或对象)实例。
  • 不应与四人帮单身汉混淆,每个ClassLoader只有一个实例。
  • 在您的上下文中,明确定义了两个具有地址的员工bean。

答案 3 :(得分:-2)

spring singleton scope的工作原理与单例软件模式(http://en.wikipedia.org/wiki/Singleton_pattern)非常相似,其背后的主要思想是,你只需要在一个声明的bean中拥有一个实例。 IOC实例(spring执行上下文);更简洁,每次使用弹簧注入在代码的任何bean中引用a2,e或e2时,您将拥有SAME引用,这意味着,相同的对象位于相同的内存位置。

我建议你看一下:

http://www.tutorialspoint.com/spring/spring_bean_scopes.htm  以及一些工作实例: http://www.mkyong.com/spring/spring-bean-scopes-examples/

最后一件事,IOC实例与对象实例不同,容器实例就像你的main方法,所以一切都在它内部执行,你可以创建bean并在一个IOC容器内做所有事情(当然有一些分布式环境架构你可以有更多的IOC容器实例,但我相信不是你的情况)