第四章 Spring.Net 如何管理您的類___對象的生命周期鏈


  各位,實在不好意思,因為有事,博客幾天沒更新了。前面有童鞋提到,配置 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 提供了一個容器(大工廠),通過這個容器我們可以完成:組件實例化,依賴裝配,生命周期控制;

  有了這個容器后開發就變成這樣:

  ① 使用和配置是分離的,程序關心是如何做事情,而不關心依賴從哪里來,程序只關心你把東西給我就行。由容器通過讀取相應的配置來完成依賴注入。

  ② 配置分離后,我們可以通過更改配置來改變,程序的策略,而不需要重新編譯代碼。

  ③ 提供了一個對象生命周期鏈條,在這個鏈條上可以完成很多事情,如:裝載,實例化,銷毀等等。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM