1

我在 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

4 回答 4

1

Singleton Scoped bean 是直截了当的:每个 bean 实际上是一个在容器中实例化的对象(也称为应用程序上下文)。

在您的示例中,Spring 容器将创建 2 个Employee对象(又名 Bean),它们分别是ee1

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


请注意:不要将此单例与单例设计模式混淆。除了“唯一”的特征外,它们没有任何共同之处。单例设计模式具有许多其他特性(例如,全局可用的查找方法;整个进程空间中只有一个实例;不允许显式实例化等)与 Spring 的单例范围无关

于 2015-04-17T02:59:59.760 回答
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。

于 2015-07-25T19:33:16.213 回答
0
  • 单例是 spring 中的默认范围,即每个容器一个 bean(或对象)实例。
  • 不应与The Gang of Four Singleton 混淆,它每个实例只有一个实例ClassLoader
  • 在您的上下文中,明确定义了两个带地址的员工 bean。
于 2018-12-25T10:20:30.560 回答
-2

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

我建议你看看这个:

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

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

于 2015-04-17T01:58:15.933 回答