LYWILL设计运营 - 网站运营与推广、开发技术、成功项目展示。

Spring.NET的容器中对象的作用域总结

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

Objects.xml:

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2.   
  3.     
  4.   
  5. <objects xmlns=http://www.springframework.net   
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  7. xsi:schemaLocation="http://www.springframework.net   
  8. http://www.springframework.net/xsd/spring-objects.xsd">  
  9.   
  10. <!--单例模式-->  
  11. <object id="personDao" type="SpringNetScop.PersonDao, SpringNetScop" />  
  12.   
  13. <!--非单例模式-->  
  14. <object id="person" type="SpringNetScop.Person, SpringNetScop" singleton="false" />  
  15.   
  16. <!--调用时加载-->  
  17. <object id="personServer" type="SpringNetScop.PersonServer, SpringNetScop" lazy-init="true" />  
  18.   
  19. </objects>  

 

         调用单例模式:

C#代码
  1. public void CreateWithSingleton()   
  2. {   
  3.     string[] xmlFiles = new string[]    
  4.     {   
  5.         "assembly://SpringNetScop/SpringNetScop/Objects.xml"  
  6.     };   
  7.     IApplicationContext context = new XmlApplicationContext(xmlFiles);   
  8.   
  9.   
  10.     IObjectFactory factory = (IObjectFactory)context;   
  11.     object obj1 = factory.GetObject("personDao");   
  12.     object obj2 = factory.GetObject("personDao");   
  13.     Assert.AreEqual(obj1, obj2);   
  14. }   
 
        调用非单例模式:
C#代码
  1. public void CreateWithOutSingleton()   
  2. {   
  3.     string[] xmlFiles = new string[]    
  4.     {   
  5.         "assembly://SpringNetScop/SpringNetScop/Objects.xml"  
  6.     };   
  7.     IApplicationContext context = new XmlApplicationContext(xmlFiles);   
  8.   
  9.     IObjectFactory factory = (IObjectFactory)context;   
  10.     object obj1 = factory.GetObject("person");   
  11.     object obj2 = factory.GetObject("person");   
  12.     Assert.AreNotEqual(obj1, obj2);   
  13. }   

 

 

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

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

<!--调用时加载-->
<object id="personServer" type="SpringNetScop.PersonServer, SpringNetScop" lazy-init="true" />
        调用时加载:
C#代码
  1. public void CreateWithLazy()   
  2. {   
  3.     string[] xmlFiles = new string[]    
  4.     {   
  5.         "assembly://SpringNetScop/SpringNetScop/Objects.xml"  
  6.     };   
  7.     IApplicationContext context = new XmlApplicationContext(xmlFiles);   
  8.     IObjectFactory factory = (IObjectFactory)context;   
  9.     object dao = factory.GetObject("personDao");   
  10.     Console.WriteLine(dao.ToString());   
  11.     object server = factory.GetObject("personServer");   
  12.     Console.WriteLine(server.ToString());   
  13. }  
 

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

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

标签: Spring.NET

作者:lywill 分类:开发技术 浏览:2423 评论:0