第四章 Spring.Net 如何管理您的类___对象的作用域
Spring.Net 中对象的作用域,就是描述对象的部署模式 ,Spring.Net 中对象可以通过两种模式布署:
① singleton(单例模式)
② 非singleton 也叫非单例模式(或者叫做 prototype,只是用在这里不是很合适)
当一个对象被定义为 singleton 时,容器中就只会有一个共享的实例,任何时候通过id或别名请求该对象都会返回这个共享实例的引用(也就是说这个对象只会被创建一次)。
当使用 非singleton,或者说原型模式布署时,每次请求对象都会创建新的实例。在某些场合,如果需要为每个用户返回单独的用户对象或其它对象,非singlton 布署模式就比较理想。Spring.Net 默认使用的是 单例模式( singleton ),即每次调用 factory.GetObject 方法时得到的都是一个实例。
如果没有显式指定, Spring.Net 中对象的布署模式默认为 singleton 。注意 非singleton(原型)模式 会使Spring.NET在每次请求对象时都创建新的实例,这也许并非是我们预期的行为。所以,除非绝对需要,否则不要使用原型模式。
设置对象的作用域,也称设置部署模式,需要使用到 singleton 属性,当 singleton 属性设置为 true 时,开启单例模式。singleton为 false 时,关闭单例模式。Spring.Net 默认为开启单例模式。
一 . 在设置为单例模式下:
Objects.xml为:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <objects xmlns="http://www.springframework.net"> 3 4 <!--通过默认的 singleton="true" (默认为单例模式,我们这里显示设置)--> 5 <object id="hexu" type="CnblogLesson_4_3.Model.Person,CnblogLesson_4_3" singleton="true"> 6 <property name="Id" value="1"/> 7 <property name="Name" value="hexu"/> 8 <property name="IsStudent" value="false"/> 9 </object> 10 11 </objects>
由于前面 对象 使用了默认的 singleton="true",我们通过运行时监控变量来看一下 hexu1 和 hexu2 这两个对象是否是同一个引用。
通过运行时监视变量,可以看出 hexu1与 hexu2 对象的引用为同一个。
二 . 设置为 非单例模式 (singleton="false"):
Objects.xml为:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <objects xmlns="http://www.springframework.net"> 3 4 <!-- singleton="false" (设置为非单例模式)--> 5 <object id="hexu_false" type="CnblogLesson_4_3.Model.Person,CnblogLesson_4_3" singleton="false"> 6 <property name="Id" value="2"/> 7 <property name="Name" value="hexu"/> 8 <property name="IsStudent" value="false"/> 9 </object> 10 11 </objects>
由于前面 我们手动对 对象 设置了 singleton="false"(非单例模式),我们通过运行时监控变量来看一下 hexu3 和 hexu4 这两个对象是否是同一个引用。
通过运行时监视变量,可以看出 hexu3与 hexu3 对象,虽然属性的值都是一样,但是他们的引用却不是同一个。