Spring.NET教程(五)容器中对象的作用域(基础篇)

容器中对象的部署分为两种方式:singleton和非singleton(Java里叫prototype)。这里的singleton指的是“单例模式”,就是说当一个对象被定义为singleton时,容器中就只会有一个共享的实例,任何时候通过id或别名请求该对象都会返回这个共享实例的引用(也就是说这个对象只会被创建一次)。当使用非singleton,或者说原型模式布署时,每次请求对象都会创建新的实例。在某些场合,如果需要为每个用户返回单独的用户对象或其它对象,非singlton布署模式就比较理想。Spring.net默认为singleton模式。每次调用GetObject方法时得到的都是同样的实例;当singleton="false"时,每次调用GetObject方法时得到的则是不同的实例。

<!--单例模式-->

<object id="personDao" type="SpringNetScop.PersonDao, SpringNetScop" />

CreateWithSingleton

[Test]

public void CreateWithSingleton()

{

string[] XMLFiles = new string[] 

{

"assembly://SpringNetScop/SpringNetScop/Objects.XML"

};

IApplicationContext context = new XmlApplicationContext(xmlFiles);

IObjectFactory factory = (IObjectFactory)context;

object obj1 = factory.GetObject("personDao");

object obj2 = factory.GetObject("personDao");

Assert.AreEqual(obj1, obj2);

}

我们用NUnit可以看到下图:

 

 使用singleton="false"的代码

<!--非单例模式-->

<object id="person" type="SpringNetScop.Person, SpringNetScop" singleton="false" />

CreateWithOutSingleton

[Test]

public void CreateWithOutSingleton()

{

string[] XMLFiles = new string[] 

{

"assembly://SpringNetScop/SpringNetScop/Objects.XML"

};

IApplicationContext context = new XmlApplicationContext(xmlFiles);

IObjectFactory factory = (IObjectFactory)context;

object obj1 = factory.GetObject("person");

object obj2 = factory.GetObject("person");

Assert.AreNotEqual(obj1, obj2);

}

Person

public class Person

{

public Person()

{

Console.WriteLine("Person被实例");

}

public override string ToString()

{

return "我是Person";

}

~Person()

{

Console.WriteLine("Person被销毁");

图为:

 

这说明singleton=false后,每次调用GetObject方法获取的对象是不同实例的,当脱离调用方法(CreateWithOutSingleton)的作用域后,该实例会被Spring.net容器销毁。

lazy-init属性是指:当Spring.NET容器初始化的时候标注该属性的对象将被实例化,反之则是调用GetObject方法的时候才被实例化。

<!--调用时加载-->

<object id="personServer" type="SpringNetScop.PersonServer, SpringNetScop" lazy-init="true" />

CreateWithLazy

[Test]

public void CreateWithLazy()

{

string[] XMLFiles = new string[] 

{

"assembly://SpringNetScop/SpringNetScop/Objects.XML"

};

IApplicationContext context = new XmlApplicationContext(xmlFiles);

IObjectFactory factory = (IObjectFactory)context;

object dao = factory.GetObject("personDao");

Console.WriteLine(dao.ToString());

object server = factory.GetObject("personServer");

Console.WriteLine(server.ToString());

}

PersonServer

public class PersonServer

{

public PersonServer()

{

Console.WriteLine("PersonServer被实例");

}

public override string ToString()

{

return "我是PersonServer";

}

}

如图:

 

PersonDao类未设置lazy-init属性,则当Spring.NET初始化时被实例;PersonServer类设置lazy-init="true",则当调用GetObject方法时才被实例。

一般情况下可以有选择的设置lazy-init属性,正如双刃剑一样,设置为lazy-init=true的时候应用程序启动时会快一点,但是在启动的时候就不能够帮我们检测错误,但当调用的时候一旦发生错误,后果是不堪设想的。

更多资料请查看Spring.NET中文手册。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzhdim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值