Spring框架經過POJO最小侵入性編程、DI、AOP、模板代碼手段來簡化了Java 開發,簡化了企業應用的開發。POJO和模板代碼相對來講好理解,本篇重點解讀下DI和AOP。java
對象的依賴關係將由系統中負責協調各對象的第三方組件在建立對象的時候進行設定。對象無需自行的建立或管理它們的依賴關係。正則表達式
咱們行來假設沒有Spring 來管理注入依賴關係,咱們是怎麼來實現依賴關係管理的,直接在對象內部經過new進行建立對象,每一個對象負責管理與本身相互協做的的對象(即它所依賴的對象)的引用,是程序主動去建立依賴對象。下面的一段代碼是在沒有用Spring 來實現DI的狀況下,咱們是怎麼作的,這樣作的問題在哪?編程
1.高度的耦合,RecognitionServiceImpl 和ContractRepository 二者耦合在一塊兒。緩存
2.難以測試,若是咱們想測試RecognitionService,在不改代碼下很難來測試。安全
經過DI,對象的依賴關係將由系統中負責協調各對象的第三方組件在建立對象的時候進行設定。對象無需自行的建立或管理它們的依賴關係。DI帶來的最大的收益是——鬆耦合。其次是面向接口依賴的可替換(經常使用的是測試的時候使用mock實現)app
在Spring 框架中怎麼來實現DI呢?框架
在Spring中建立應用組件之間的協做方式一般稱爲裝配(wiring)。它提供了三種裝配實現方式,分別是XML裝配、JavaConfig裝配、自動裝配。模塊化
組件掃描(component scanning) : Spring會自動發現應用上下文中所建立的bean 函數式編程
自動裝配(autowiring) : Spring自動知足bean之間的依賴。函數
簡單來講,DI目的只有一個就是解耦,實現代碼的鬆散耦合。高耦合的代碼不易測試、不易複用。
AOP,面向切面編程,經過預編譯方式和運行期間動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是Spring框架中的一個重要內容,是函數式編程的一種衍生範型。利用AOP能夠對業務邏輯外的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度下降,提升程序的可重用性,同時提升了開發的效率。是否是有點不太好理解。咱們先有個概念上的認識,就是面向切面編程。所謂切面,橫切關注點模塊化爲特殊的類,這些類被稱爲切面。
理解AOP最關鍵的點是先理解橫切關注點,所謂的橫切關注點是指散佈於應用中的多處功能。最典型的橫切關注點有日誌記錄、性能統計、安全控制、事務處理、異常處理、緩存等。這些橫切的關注點從概念上與應用的業務邏輯相分離的(可是每每會直接嵌入到應用的業務邏輯中去)。沒有AOP,咱們每每會把這些橫切的關注點來直接嵌入到業務邏輯中去,這樣作的一個問題是什麼?一是分散在多處,就是這類的代碼分散在多處代碼中,重複出現。二是 與業務代碼耦合在一塊兒。把這些橫切關注點與業務邏輯相分離,解耦是面向切面編程(AOP)要解決的問題。
經過AOP 來解決橫切關注點與業務邏輯相分離解耦。橫切關注點要以描述爲影響多處的功能,例如:安全就是一個橫切關注點,應用中的許多方法都會涉及到安全規則,事務也是一個橫切關注點,應用在不少方法中。
橫切關注點能夠被模塊化爲特殊的類,這些類被成爲切面(aspect)。切面有兩個好處,一是每一個關注點都集中於一個地方,二服務模塊更加的簡潔,只需主要關注於業務邏輯,像安全,事務等次要的關注點被轉移到了切面中。
AOP已經有了本身的一些術語。描述切面的經常使用術語有通知(advice)、切點(point)、和鏈接點。
在aop 術語中,切面的工做被成爲通知。通知定義了切面是什麼以及什麼時候使用。通知有兩個功能,一個是描述切面要作什麼?另外一個是什麼時候作。簡單來講是在某個方法被調用以前執行,仍是以後執行,仍是以前以後都要執行,仍是隻在方法拋出異常是執行。
Spring 切面能夠應用5種類型的通知。
鏈接點(Join Point)
應用有不少的時機去應用(調用通知),這些時機被稱爲鏈接點。鏈接點是應用執行過程當中可以插入切面的一個點。這個點能夠是調用方法時,拋出異常時,甚至是修改一個字段時。切面代碼能夠利用這些點插入到應用的正常流程之中,並添加新的行爲。
切點(Poincut)
若是通知定義了切面的」什麼(what)「和」什麼時候(when)" 的話,那麼切點就定義了「何出(where)"。切點的定義會匹配要織入的一個或多個鏈接點。一般使用明確的類和方法名稱,或者是利用正則表達式來定義所匹配的類和方法名來指定切點。
切面(Aspect)
切面是通知和切點的結合,通知和切點來定義了切面的所有內容,它是什麼,在什麼時候何處完成其功能。
引入(Introduction)
引入容許向現有的類添加新方法和屬性。
織入(Weaving)
織入是把切面應用到目標對象並建立新的代理對象的過程。切面在指定的鏈接點被織入到目標對象中。在目標對象的生命週期中有多個點能夠織入。編譯期(AspectJ),類加載期(AspectJ5 支持),運行期(Spring Aop 以這種方式織入切面的)。
總結一下:通知包含了須要應用多個應用對象的橫切行爲;鏈接點是程序執行過程當中可以應用通知的全部點;切點定義了通知被應用的具體位置(即哪些鏈接點)。簡而言之:切點定義了哪些鏈接點會獲得通知。
建立切點來定義切面所織入的鏈接點是AOP框架的基本功能。
Spring 提供了4種AOP的支持。
前三種都是Spring Aop 的變體,SpringAop 構建在動態代理基礎之上(即基於動態代理),Spring對AOP的支持侷限於方法攔截。
理解了這些概念後如何應用Spring AOP就相對而言來講簡單的多了。
DI目的只有一個就是解耦,實現代碼的鬆散耦合。解決高耦合的代碼帶來的不易測試、不易複用的問題。
AOP解決的問題是如何把應用中橫切關注點與業務邏輯相分離,解耦。把以前分散在應用各處的行爲放入可重用的模塊中,有效減小了代碼冗餘,並讓類更關注於自身的主要功能和業務邏輯。