作者:Java程序媛環環
來源:https://blog.csdn.net/Lubanjava/article/details/100084602
依賴注入是面型接口編程的一種體現,是Spring的核心思想。事實上依賴注入並不是什麼高深的技術, 只是被Sping這麼以包裝就顯得有些神秘。
如上代碼清單所示,Coder使用Java語言列印helloworld字符串, 在這裡它不但依賴Language接口, 還依賴Java類,這使得它和Java類耦合在一起。要消除這種依賴或者說解耦很容易。
我們給Coder類增加了設置具體語言的方法,使得Coder類只依賴Language接口而不依賴具體的語言實現,換言之,Coder類和具體的語言解耦了,此時我們可以輕而易舉的使用其它語言代替Java,比如說使用C#。
這種在外部設置某個對象所依賴的具體對象的技巧就是依賴注入,這很很令人以外,一種最常見不過的編碼技巧居然還有如此高大山的名稱。
對於Coder類來說,確定使用何種語言原本實在編譯器期確定的,使用依賴注入後,使用何種語言便延時至運行期。
Spring框架的核心思想便是基於此,不過它的實現更進一步,它把創建各個對象設置依賴關係的過程動態化和通用化了。在我們的代碼清單中,創建對象和設置依賴關係的main方法只適用與當前的情況,而Spring的IOC容器能適用與任何情況
通常,Spring的依賴關係由XML表示,IOC容器解析XML完成對象的創建和依賴注入。
我們將之前的代碼用Spring框架來實現:
依賴關係將由XML配置實現
創建Coder對象的代碼變為
具體的對象創建和依賴關係的設置將由IOC根據XML配置來完成,Spring使得依賴注入機制自動化,但是依賴注入的本質卻沒有變花。
面向切面編程能實現不改變原有代碼的前提下動態的對功能進行增強, 比如說在一個方法執行前或執行後做某些事情如記錄日誌、計算運行時間等等。
Spring中完美集成Aspectj,因此可以很方便的進行面向切面編程。
Spring Aspectj有幾個註解用以實現常用的面向切面編程功能
如上代碼所示, 此類對controller.Default類下的所有方法進行增強。
@Before註解
@Before註解修飾的方法會在被增強的方法執行前被執行
@After註解
@After註解修飾的方法會在被增強的方法執行後被執行
@AfterReturning註解
@AfterReturning註解修飾的方法會在被增強的方法執行後被執行,但前提是被修飾的方法順利執行結束,假如方法中途拋出異常,那麼AfterReturning註解修飾的方法將不會被執行,而After註解修飾的方法是無論如何都會被執行。
@AfterThrowing註解
@AfterThrowing註解修飾的方法會在被增強的方法執行出錯拋出異常的情況下被執行。
@Around註解
@Around註解是@Before註解和@After註解的綜合,它可以在被增強的方法的前後同時進行增強
使用此註解,被增強的方法需要手動編碼調用
jp.proceed();
如果在增強代碼中不寫這一句,那麼被增強的方法將不會運行。
此外, 還有一個重要的註解 @Pointcut
@Pointcut註解
此註解可以用來提煉切入點
@Before、@After等註解可以應用此註解聲明的切入點,從而減少代碼的重複。