反向控制和面向切面程式設計在Spring的應用

2021-08-29 21:46:39 字數 2752 閱讀 6478

針對傳統的j2ee架構方案常常無法讓人滿意:程式過於複雜,難以測試和維護成本高。根據企業實際需求,本文**了一種輕量級的j2ee應用框架spring ,它用更加輕量、更加靈活的基礎設施取代了ejb。在此對spring背後的反向控制原理和面向切面程式設計技術進行了比較深入研究,並與傳統實現進行對比,顯示了這種框架具有大大降低開發成本,可測試等優點。

1、spring ioc 1.1 反向控制原理

反向控制是spring框架的核心。但是,反向控制是什麼意思?到底控制的什麼方面被反向了呢?2023年美國專家martin fowler發表了一篇**《inversion of control containers and the dependency injection pattern》闡述了這個問題,他總結說是獲得依賴物件的方式反向了,根據這個啟示,他還為反向控制提出了乙個更貼切的名字:dependency injection(di 依賴注入)。

通常,應用**需要告知容器或框架,讓它們找到自身所需要的類,然後再由應用**建立待使用的物件例項。因此,應用**在使用例項之前,需要建立物件例項。然而,ioc模式中,建立物件例項的任務交給ioc容器或框架(實現了ioc設計模式的框架也被稱為ioc容器),使得應用**只需要直接使用例項,這就是ioc。相對ioc 而言,「依賴注入」的確更加準確的描述了這種設計理念。所謂依賴注入,即元件之間的依賴關係由容器在執行期決定,形象的來說,即由容器動態的將某種依賴關係注入到元件之中。

1.2 ioc在spring中的實現

任何重要的系統都需要至少兩個相互合作的類來完成業務邏輯。通常,每個物件都要自己負責得到它的合作(依賴)物件。你會發現,這樣會導致**耦合度高而且難於測試。使用ioc,物件的依賴都是在物件建立時由負責協調系統中各個物件的外部實體提供的,這樣使軟體元件鬆散連線成為可能。下面示意了spring ioc 應用,步驟如下:

(1)定義action介面,並為其定義乙個execute方法,以完成目標邏輯。多年前,gof在《design pattern:elements of reusable object-oriented software》一書中提出「programming to an inte***ce,not an implementation」的原則,這裡首先將業務物件抽象成介面,正是為了實施這個原則。

(2)類upperaction實現action介面,在此類中,定義乙個string型的域message,並提供相應的setter和getter方法,實現的execute方法如下:

public string execute (string str)

(3)編寫spring配置檔案(bean.xml)

<beans>

<bean id="theaction" class="net.chen.spring.qs.upperaction">

<property name="message">

<value>hello</value>

</property>

</bean>

</beans>

(4)測試**

public void testquickstart ()

……hello rod johnson

仔細觀察一下上面的**,可以看到:

(1)我們的元件並不需要實現框架指定的介面,因此可以輕鬆的將元件從spring中脫離,甚至不需要任何修改,這在基於ejb框架實現的應用中是難以想象的。

(2)元件間的依賴關係減少,極大改善了**的可重用性。spring的依賴注入機制,可以在執行期為元件配置所需資源,而無需在編寫元件**時就加以指定,從而在相當程度上降低了元件之間的耦合。

spring給我們帶來了如此這般的好處,那麼,反過來,讓我們試想一下,如果不使用spring框架,回到我們傳統的編碼模式,情況會是怎樣呢?

首先,我們必須編寫乙個配置檔案讀取類,以實現message屬性的可配置化。

其次,得有乙個factory模式的實現,並結合配置檔案的讀寫完成action的動態載入。於是,我們實現了乙個actionfactory來實現這個功能:

public class actionfactory catch (filenotfoundexception e)

} 配置檔案則採用properties檔案形式如下所示:

theaction=net.chen.spring.qs.upperaction

theaction_msg=hello

測試**也作相應修改。現在不論實現的好壞,總之通過上面新增的多行**,終於實現了類似的功能。如果現在有了乙個新的需求,這樣這個actionfactory每次都新建乙個類的例項,顯然這對系統效能不利,考慮到我們的兩個action都是執行緒安全的,修改一下actionfactory,保持系統中只有乙個action例項供其它執行緒呼叫。另外action物件建立後,需要做一些初始化工作。修改一下actionfactory,使其在建立action例項之後,隨即就呼叫action.init方法執行初始化。action的處理這樣就差不多了。下面我們來看看另外乙個factory

……往往這些系統開發中最常見的需求,會導致我們的**迅速膨脹,而spring ioc的出現,則大大緩解了這樣的窘境。通過以上例項,可以看出,spring ioc為我們提供了如下幾方面的優勢:

(1)應用元件不需要在執行時尋找其協作者,因此更易於開發和編寫應用;

(2)由於借助於ioc容器管理元件的依賴關係,使得應用的單元測試和整合測試更利於展開;

(3)通常,在借助於ioc容器關係業務物件的前提下,很少需要使用具體ioc容器提供的api,這使得整合現有的遺留應用成為可能。

因此,通過使用ioc能夠降低元件之間的耦合度,最終,能夠提高類的重用性,利於測試,而且更利於整個產品或系統整合和配置。

Spring 的面向切面程式設計(AOP)

aop是一種新的方 是物件導向程式設計的補充。aop的主要關注點是切面,是切面模組化的橫切關注點。使用aop的好處 1.每個事物邏輯位於乙個位置,不分散。便於維護和公升級。2.業務模組更簡潔,只包含核心業務 spring aop的方式有2種,一種是通過註解的方式。一種是通過xml配置檔案的方式。1....

Spring中的AOP 面向切面程式設計

spring框架中採用動態 來實現方法的增強,稱之為aop即面向切面程式設計 要增強的方法稱為切入點方法 aop中的通知 即增強的內容 分為 前置通知 在切入點方法之前執行 後置通知 在切入點方法正常執行之後執行 異常通知 在切入點方法出現異常之後執行 最終通知 最終都會執行的方法 環繞通知 可以通...

Spring 面向切面程式設計AOP的簡單理解及實現

aop,面向切面程式設計,利用aop可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。aop的主要功能 許可權控制 事務管理 日誌列印 效能統計 異常處理等 aop的三大點 1 關注點 重複 2 切面 抽取重複 3 切入點 攔截哪些方...