1. 程式人生 > >關於Spring IOC與Spring AOP的總結

關於Spring IOC與Spring AOP的總結

一、概述

spring 的ioc解決的是物件之間的依賴的問題。spring 的aop解決的是業務邏輯和系統公用模組之間的解耦的問題。

他將系統公用的模組,比如事務處理、安全監聽、列印日誌等等模組,作為橫切關注點,在不破壞原有業務邏輯的前提下,插入業務邏輯層。這樣就相當於在業務邏輯層插入了一些公用模組的元件,來幫助我們監聽系統的執行情況。

在涉及到公共模組的修改的時候,不用在連線點附近一個一個修改,而是隻要修改公用的那個模組就可以了(即橫切關注點)。這樣就實現了橫切關注點和業務邏輯之間的解耦。

Spring預設使用JDK動態代理實現AOP代理。這使得任何介面或 介面的集合能夠被代理。Spring也可以是CGLIB代理。這可以代理類,而不是介面。

二、總結

(1)spring ioc

spring ioc是通過spring框架的封裝,實現了依賴的反轉,即:不是專案依賴於容器,而是容器為專案提供服務。

換句話說,原本傳統模式下,我們是先建立專案,然後手動的建立容器,容器裡面再注入各種各樣的實體類,塞滿容器。這樣做,我們會很累,因為當你的專案越來越大的時候,光是一個jdbc的容器,我們就要注入很多層。

反之,如果我們在專案啟動的時候,就先把這些需要使用到的容器,通過spring先完成依賴關係的注入,那麼我們在專案中,需要使用這些元件的時候,就可以直接使用了,就不用再一次一次的手動注入、生成這些元件了。

這也就是不是專案依賴於容器,而是容器為專案提供服務這句話的深層次含義。

(2)spring aop

spring aop做的事情,和spring ioc有相似之處。

他們兩個都實現了程式碼的解耦,ioc解耦了專案和容器之間的耦合。而aop解耦了核心業務邏輯層和輔助功能層(比如:事務處理、日誌列印、安全監控等等)之間的耦合。

spring ioc是完成組建的注入,讓我們在專案中可以直接使用,而不用一次次的手動注入,減少了我們的冗餘程式碼。

而spring aop的實現邏輯則不同:

假設專案的業務邏輯層已經完善,但是我們需要在A、B、C業務中加入不同的輔助功能(之所以叫做輔助功能,是因為這些功能是不影響業務邏輯的)比如,A業務是事務處理。B事務是安全監聽。C事務是日誌列印。

你可以看到A、B、C三個業務對於我們原本的核心業務邏輯是不產生任何影響的。

我們傳統的做法是,每次遇到A、B、C業務的時候,都自己去手寫,這樣當然是可以的。

但是,有沒有更好的方式?有,spring AOP就提供了這樣的解決辦法。

我們在spring aop 中,主要是基於動態代理,將業務邏輯的方法呼叫點做了分隔或者說打斷,打斷之後,我們可以在這個方法的呼叫點前後,加上自定義的方法。

這樣做的好處是在於:

1.打斷之後,我們可以將A、B、C三個業務模組寫到一個公共的地方,減少了冗餘程式碼,提升了程式碼的可維護性。

2.我們可以將打斷的所有點,稱為切入點,我們可以管理這些切入點。

3.我們可以對目標類進行引入(增加方法或欄位)。

4.將輔助功能和業務邏輯解耦,兩者非耦合,提升了程式碼的靈活度。

也就是說,當我需要將輔助層(比如:事務管理邏輯層、效能監視邏輯層)的功能做優化和改動的時候,不會涉及業務邏輯層的程式碼的修改,不會影響業務邏輯層的執行。

實際上,spring aop運用了代理,代理能夠將類和方法作為引數,通過其中封裝的方法來呼叫任意被代理類的任意方法(當然介面也可以被代理)。正因為代理的這個特性,使得spring aop具備了某種類似於打斷的功能:我只要把你這個類代理了,然後我在你呼叫前後,加上我的橫切關注點(輔助功能模組)就好了。