各位,實在不好意思,因為有事,博客幾天沒更新了。前面有童鞋提到,配置 Objects.xml 路徑的相關問題,這些東西是 IResource 接口的一些內容。在下一章會詳細介紹。
傳統的Net應用中,對象的生命周期非常簡單。.Net中的關鍵詞 new 用來實例化對象(或許它是非序列化的)。這樣就夠用了。相反,對象 的生命周期在 Spring.Net 容器中更加細致。理解 Spring.Net 對象的生命周期非常重要,因為你或許要利用 Spring.Net 提供的機制來訂制對象的創建過程。我們在前面幾章討論了 Spring.Net 對象生命周期中大部分常用的細節。本小節我們來把前面零零散散的這些細節匯總一下。
一 . IObjectFactory 中的生命周期
下面這附圖是 Spring.Net 對象在 IObjectFactory 中的生命周期:
(1) 容器尋找到對象的 定義信息 並且將其實例化。
(2) 受用依賴注入,Spring.Net 按照對象定義信息配置對象的所有屬性。
(3) 如果對象實現了 IObjectNameAware 接口,工廠調用對象的設置 ObjectName 的方法傳入對象名稱。
(4) 如果對象實現了 IObjectFactoryAware 接口,工廠調用對象的設置 ObjectFactory 的方法傳入工廠自身。
(5) 如果 IObjectPostProcessor 實現類和對象關聯,那么它們的 PostProcessBeforeInitialization 方法將被調用。
(6) 如果對象指定了 init-method 方法,它將被調用。
(7) 如果有 IObjectPostProcessor 實現類和對象關聯,那么它們的 PostProcessAfterInitialization 方法將被調用。 到這個時候,對象已經可以被應用系統使用了,並且將被保留在 IObjectFactory 中。如果知道它不再需要了,則有兩種常見的方法可以把它從 對象 Factory 中刪除掉。
① 如果對象實現了 System.IDisposable 接口,Dispose() 方法被調用。
② 如果指定了訂制的銷毀方法,就調用這個方法。
二 . IApplicationContext的生命周期
對象在 IApplicationContext 的生命周期與在 IObjectFactory 中的生命周期只有一點不同,唯一不同的是,如果對象實現了 IApplicationContextAware 接口,設置ApplicationContext 的方法被調用。如下圖:
下面,我們用代碼的方式來看下 對象的生命周期鏈 。廢話不多說,直接上代碼,來看:
1 using System; 2 using Spring.Objects.Factory; 3 using Spring.Context; 4 5 namespace CnblogLesson_4_9.Model 6 { 7 public class Person : IPerson, IObjectNameAware, IObjectFactoryAware, IApplicationContextAware 8 { 9 private string _objectName; 10 private IObjectFactory _iObjectFactory; 11 private IApplicationContext applicationContext; 12 13 public Person() { 14 Console.WriteLine("調用Person的構造函數"); 15 } 16 17 public void Init() { 18 Console.WriteLine("調用Person的Init方法"); 19 } 20 21 public void Destroy() { 22 Console.WriteLine("調用Person的Destroy方法"); 23 } 24 25 public string ObjectName 26 { 27 set { 28 _objectName = value; 29 Console.WriteLine("調用IObjectNameAware的設置ObjectName方法"); 30 } 31 } 32 33 public IObjectFactory ObjectFactory 34 { 35 set 36 { 37 _iObjectFactory = value; 38 Console.WriteLine("調用IObjectFactoryAware的設置ObjectFactory方法"); 39 } 40 } 41 42 public IApplicationContext ApplicationContext 43 { 44 set 45 { 46 applicationContext = value; 47 Console.WriteLine("調用IApplicationContextAware的設置ApplicationContext方法"); 48 } 49 } 50 } 51 }
Person 這個類實現 ,IPerson, IObjectNameAware, IObjectFactoryAware, IApplicationContextAware 接口。
1 using System; 2 using Spring.Objects.Factory.Config; 3 4 namespace CnblogLesson_4_9.Model 5 { 6 class HexuObjectPostProcessor : IObjectPostProcessor 7 { 8 public object PostProcessAfterInitialization(object instance, string objectName) 9 { 10 Console.WriteLine("調用了IObjectPostProcessor的PostProcessAfterInitialization方法"); 11 return instance; 12 13 } 14 15 public object PostProcessBeforeInitialization(object instance, string name) 16 { 17 Console.WriteLine("調用了IObjectPostProcessor的PostProcessBeforeInitialization方法"); 18 return instance; 19 } 20 } 21 }
HexuObjectPostProcessor 實現了 IObjectPostProcessor 接口。
Objects.xml 的配置如下:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <objects xmlns="http://www.springframework.net"> 3 4 <object id="hexu" type="CnblogLesson_4_9.Model.Person,CnblogLesson_4_9" init-method="Init" destroy-method="Destroy"/> 5 6 <object type="CnblogLesson_4_9.Model.HexuObjectPostProcessor,CnblogLesson_4_9"/> 7 </objects>
然后我們來運行程序:
通過結果,我們可以看到,Spring.Net 中 對象的生命周期鏈的全過程。
Spring.Net 提供了一個容器(大工廠),通過這個容器我們可以完成:組件實例化,依賴裝配,生命周期控制;
有了這個容器后開發就變成這樣:
① 使用和配置是分離的,程序關心是如何做事情,而不關心依賴從哪里來,程序只關心你把東西給我就行。由容器通過讀取相應的配置來完成依賴注入。
② 配置分離后,我們可以通過更改配置來改變,程序的策略,而不需要重新編譯代碼。
③ 提供了一個對象生命周期鏈條,在這個鏈條上可以完成很多事情,如:裝載,實例化,銷毀等等。