我为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>
答案 0 :(得分:1)
Singleton Scoped bean很简单:每个bean实际上是在容器中实例化的一个对象(也就是应用程序上下文)。
在您的示例中,Spring容器将创建2个Employee
个对象(也称为Beans),分别为e
和e1
。
其他范围有点棘手。可以为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)
ClassLoader
只有一个实例。 答案 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容器实例,但我相信不是你的情况)