Spring.NET中,容器对象中的作用域
Spring.Net中,容器对象部署分为单列(singleton)和非单列模式(非singleton)。单列模式下,即一个对象被定义为singleton时,容器中就只会有一个共享实例,任何时候通过id或别名请求该对象,都只会返回改共享实例。也就是说,这个实例之会被创建一次。但使用非Singleton模式时,每次请求对象,都会创建一个新的实例对象。Spring.Net默认使用单例模式。每次调用GetObject时,创建的都是同一个实例;当Singleton='false'时,调用GetObject时,创建的是不同的实例对象。当脱离调用方法作用域时,容器对象即被销毁。
一。单例模式(Singleton)和非单例模式
1 <objects> 2 <!--spring.net默认使用单列模式--> 3 <object name="myIoc" type="SimpleIOC.model.Customer,SimpleIOC"></object> 4 </objects>
1 public static void Main(string[] args) 2 { 3 IApplicationContext context = ContextRegistry.GetContext(); 4 Customer customer = (Customer)context.GetObject("myIoc"); 5 Console.WriteLine(customer.GetType()); 6 Customer customer1 = (Customer)context.GetObject("myIoc"); 7 Console.WriteLine(customer.Equals(customer1));//返回true 8 Console.ReadKey(); 9 }
1 objects> 2 <!--ASP.NET默认使单列模式--> 3 <object name="myIoc" type="SimpleIOC.model.Customer,SimpleIOC" singleton="false"></object> 4 </objects>
1 Console.WriteLine(customer.Equals(customer1));//返回false
二。容器对象创建控制
属性lazy-init属性控制容器创建对象时间。属性设置为true时,容器在GetObject创建对象,设置为false时,容器在ASP.NET初始化时创建对象,默认是false,在容器初始化时创建对象。当设置为true时,程序启动会快点,但是不会帮我们检测错误了,在调用是一旦发生错误,后果不堪设想。
1 <objects> 2 <!--设置lazy-init=false,在ASP.NET初始化的时候创建对象。ASP.NET默认是false--> 3 <object name="myIoc" type="SimpleIOC.model.Customer,SimpleIOC" lazy-init="false"></object> 4 </objects>
1 public static void Main(string[] args) 2 { 3 IApplicationContext context = ContextRegistry.GetContext(); 4 Console.WriteLine("First"); 5 Customer customer = (Customer)context.GetObject("myIoc"); 6 Console.WriteLine(customer.GetType()); 7 Customer customer1 = (Customer)context.GetObject("myIoc"); 8 Console.WriteLine(customer.Equals(customer1));//返回true 9 Console.ReadKey(); 10 }
输出结果,可见,ASP.NET初始化时就创建了对象:
lazy-init='true',在GrtObject的时候,创建对象:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <objects> 3 <!--设置lazy-init=true,在GetObject时,创建对象--> 4 <object name="myIoc" type="SimpleIOC.model.Customer,SimpleIOC" lazy-init="true"></object> 5 </objects>
备忘记,折构函数:当对象脱离作用域是,被调用。一般是用来清除对象的。有GC控制调用
1 public class Customer 2 { 3 public Customer() 4 { 5 Console.WriteLine("customer被创建"); 6 } 7 ~Customer() 8 { 9 //折构函数,当对象脱离作用域是,被调用。一般是用来清除对象的。有GC控制调用 10 Console.WriteLine("customer被销毁"); 11 } 12 }
生命需要感动和奇迹。成功不易,放弃简单。每次感觉走不下去的时候,就是通往成功的节点。努力吧,奋斗吧,即使不被全世界看好。至少,也要做个坏孩子啊