Spring.NET学习笔记5——容器中对象的作用域(基础篇) Level 200
来源:互联网 发布:阿里云各类产品介绍 编辑:程序博客网 时间:2024/06/10 04:13
容器中对象的部署分为两种方式:singleton和非singleton(java里叫prototype)。这里的singleton指的是“单例模式”,就是说当一个对象被定义为singleton时,容器中就只会有一个共享的实例,任何时候通过id或别名请求该对象都会返回这个共享实例的引用(也就是说这个对象只会被创建一次)。当使用非singleton,或者说原型模式布署时,每次请求对象都会创建新的实例。在某些场合,如果需要为每个用户返回单独的用户对象或其它对象,非singlton布署模式就比较理想。Spring.NET默认为singleton模式。每次调用GetObject方法时得到的都是同样的实例;当singleton="false"时,每次调用GetObject方法时得到的则是不同的实例。
<object id="personDao" type="SpringNetScop.PersonDao, SpringNetScop" />
[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" />
[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);
}
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" />
[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());
}
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中文手册。
代码下载
返回目录
- Spring.NET学习笔记5——容器中对象的作用域(基础篇) Level 200
- Spring.NET学习笔记5——容器中对象的作用域(基础篇) Level 200
- Spring.NET学习笔记5——容器中对象的作用域(基础篇)
- Spring.NET学习笔记5——容器中对象的作用域(基础篇)
- Spring.NET学习笔记4——对象的创建(基础篇) Level 200
- Spring.NET学习笔记7——依赖对象的注入(基础篇) Level 200
- Spring.NET学习笔记4——对象的创建(基础篇) Level 200
- Spring.NET学习笔记7——依赖对象的注入(基础篇) Level 200
- Spring.NET学习笔记11——自定义对象行为(基础篇) Level 200
- Spring.NET学习笔记8——集合类型的注入(基础篇) Level 200
- Spring.NET学习笔记10——方法的注入(基础篇) Level 200
- Spring.NET学习笔记13——AOP的概念(基础篇) Level 200
- Spring.NET学习笔记15——AOP的配置(基础篇) Level 200
- Spring.NET学习笔记8——集合类型的注入(基础篇) Level 200
- Spring.NET学习笔记15——AOP的配置(基础篇) Level 200
- Spring.NET学习笔记14——AOP的通知类型(基础篇) Level 300
- Spring.NET学习笔记14——AOP的通知类型(基础篇) Level 300
- Spring.NET学习笔记14——AOP的通知类型(基础篇) Level 300
- NAND和NOR flash的区别(转载)
- log4net使用手册
- JavaScript中函数的传递
- 游戏服务器架构简述--逻辑服务器
- 软件测试工程师必备技能
- Spring.NET学习笔记5——容器中对象的作用域(基础篇) Level 200
- 查找和列表
- Runtime.getRuntime().addShutdownHook(new Thread()
- 中国人真的要看看
- Spring.NET学习笔记6——依赖注入(应用篇) Level 300
- 一段很好的代码(copyright@sinpoal)
- jQuery中文入门指南,翻译加实例,jQuery的起点教程
- 在Visual C#中运用API函数获取系统信息
- 今天去大船上了