Spring思惟導圖,讓Spring再也不難懂(aop篇)

什麼是aopjava

AOP(Aspect-OrientedProgramming,面向方面編程),能夠說是OOP(Object-Oriented Programing,面向對象編程)的補充和完善。OOP容許你定義從上到下的關係,但並不適合定義從左到右的關係。例如日誌功能。日誌代碼每每水平地散佈在全部對象層次中,而與它所散佈到的對象的核心功能毫無關係。這種散佈在各處的無關的代碼被稱爲橫切(cross-cutting)代碼,在OOP設計中,它致使了大量代碼的重複,而不利於各個模塊的重用。程序員

什麼是aop.png

而AOP技術則偏偏相反,它利用一種稱爲「橫切」的技術,剖解開封裝的對象內部,並將那些影響了多個類的公共行爲封裝到一個可重用模塊,並將其名爲「Aspect」,即方面。所謂「方面」,簡單地說,就是將那些與業務無關,卻爲業務模塊所共同調用的邏輯或責任封裝起來,便於減小系統的重複代碼,下降模塊間的耦合度,並有利於將來的可操做性和可維護性。web

aop使用場景spring

aop框架種類編程

  • AspectJ
  • JBoss AOP
  • Spring AOP

使用aop能夠作的事情有不少。緩存

  • 性能監控,在方法調用先後記錄調用時間,方法執行太長或超時報警。
  • 緩存代理,緩存某方法的返回值,下次執行該方法時,直接從緩存裏獲取。
  • 軟件破解,使用AOP修改軟件的驗證類的判斷邏輯。
  • 記錄日誌,在方法執行先後記錄系統日誌。
  • 工做流系統,工做流系統須要將業務代碼和流程引擎代碼混合在一塊兒執行,那麼咱們可使用AOP將其分離,並動態掛接業務。
  • 權限驗證,方法執行前驗證是否有權限執行當前方法,沒有則拋出沒有權限執行異常,由業務代碼捕捉。

觀察一下傳統編碼方式與使用aop的區別 3種日誌處理.png微信

核心概念mvc

描述AOP經常使用的一些術語有通知(Adivce)、切點(Pointcut)、鏈接點(Join point)、切面(Aspect)、引入(Introduction)、織入(Weaving)、通知(Advice)等。app

aop重要概念.png

簡單例子框架

相比xml配置,基於註解的方式更加簡潔方便。

@Aspect
public class TransactionDemo {
    
    @Pointcut(value="execution(* com.yangxin.core.service.*.*.*(..))")
    public void point(){
        
    }
    
    @Before(value="point()")
    public void before(){
        System.out.println("transaction begin");
    }
    
    @AfterReturning(value = "point()")
    public void after(){
        System.out.println("transaction commit");
    }
    
    @Around("point()")
    public void around(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("transaction begin");
        joinPoint.proceed();
        System.out.println("transaction commit");
    }
}

在applicationContext.xml中配置。

<aop:aspectj-autoproxy />
<bean id = "transactionDemo" class = "com.yangxin.core.transaction.TransactionDemo" />

spring aop原理

經過前面介紹能夠知道:AOP 代理實際上是由 AOP 框架動態生成的一個對象,該對象可做爲目標對象使用。AOP 代理包含了目標對象的所有方法,但 AOP 代理中的方法與目標對象的方法存在差別:AOP 方法在特定切入點添加了加強處理,並回調了目標對象的方法。

代理的方法與目標對象的方法.png

Spring 的 AOP 代理由 Spring 的 IoC 容器負責生成、管理,其依賴關係也由 IoC 容器負責管理。所以,AOP 代理能夠直接使用容器中的其餘 Bean 實例做爲目標,這種關係可由 IoC 容器的依賴注入提供。

aop開發時,其中須要程序員參與的只有 3 個部分:

  • 定義普通業務組件。
  • 定義切入點,一個切入點可能橫切多個業務組件。
  • 定義加強處理,加強處理就是在 AOP 框架爲普通業務組件織入的處理動做。

爲了理清關係,先來個類關係圖。 Spring中主要的AOP組件.png

兩種動態代理方式

Spring默認採起的動態代理機制實現AOP,當動態代理不可用時(代理類無接口)會使用CGlib機制。

Spring提供了兩種方式來生成代理對象: JDKProxy和Cglib,具體使用哪一種方式生成由AopProxyFactory根據AdvisedSupport對象的配置來決定。默認的策略是若是目標類是接口,則使用JDK動態代理技術,不然使用Cglib來生成代理。

JDK動態代理

  • JDK動態代理主要涉及到java.lang.reflect包中的兩個類:Proxy和InvocationHandler。InvocationHandler是一個接口,經過實現該接口定義橫切邏輯,並經過反射機制調用目標類的代碼,動態將橫切邏輯和業務邏輯編制在一塊兒。

  • Proxy利用InvocationHandler動態建立一個符合某一接口的實例,生成目標類的代理對象。

CGLib動態代理

  • CGLib全稱爲Code Generation Library,是一個強大的高性能,高質量的代碼生成類庫,能夠在運行期擴展Java類與實現Java接口,CGLib封裝了asm,能夠再運行期動態生成新的class。和JDK動態代理相比較:JDK建立代理有一個限制,就是隻能爲接口建立代理實例,而對於沒有經過接口定義業務方法的類,則能夠經過CGLib建立動態代理。

知識拓展

經過上面的分析,你們是否有種熟悉的感受,彷佛和攔截器、過濾器的功能類似。那麼問題來了,aop與攔截器、過濾器是什麼關係。

先來回顧一下攔截器與過濾器。以下圖一網友的測試,在web.xml中註冊了TestFilter1和TestFilter2。而後在spring的配置文件中配置了BaseInterceptor和TestInterceptor。獲得的結果以下圖所示。從圖中能夠看出,攔截器和過濾器都橫切了業務方法,看似符合aop的思想。

攔截器和過濾器.png

Filter過濾器:攔截web訪問url地址。 Interceptor攔截器:攔截以 .action結尾的url,攔截Action的訪問。 Spring AOP攔截器:只能攔截Spring管理Bean的訪問(業務層Service)

攔截器與過濾器.png

寫在最後

下篇文章將會寫Spring cache的內容,一樣以思惟導圖的方式編寫。可視化學習,讓java再也不難懂。

最後的最後,歡迎關注個人微信公衆號java思惟導圖,下載導圖源文件,以及更多java思惟導圖與項目資料供你學習,帶你走進記憶腦圖的世界。

關注公衆號並回復「思惟導圖」當即下載源xmind導圖。

上篇文章閱讀

掃一掃關注java-mindmap公衆號.jpg

相關文章
相關標籤/搜索