第四章 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 对象,虽然属性的值都是一样,但是他们的引用却不是同一个。

posted @ 2017-05-04 16:23  韩梦芫  阅读(285)  评论(0编辑  收藏  举报