什麼是AOP?
Aop是有別與OOP模式的切面編程模式。OOP將軟件系統分爲了多個模塊類似的,用戶管理模塊,訂單管理等,而AOP是對OOP模式的一種補充,把各個模塊中需要重複涉及到的功能點給抽取出來做成一個切面的形式來提供給各個模塊使用,這種方式對業務代碼的侵入性小,耦合度低,常用的有日誌系統,異常處理,性能統計等。
在Spring中可以直接通過註解或XML配置的方式來實現AOP功能,在這順便說一句,Spring中的AOP可以說是把AspectJ的切面特性給整合進來了,對開發者更加友好。
Spring中使用AOP(註解形式):
1.首先在配置文件中配置開啓AOP
<aop:aspectj-autoproxy proxy-target-class="true"/>
proxy-target-class這個參數默認是false即使用JDK動態代理,true使用CGLIB代理,在使用JDK動態代理的時候需要注意,被代理的業務類需要實現接口才行不然會報錯,因爲jdk動態代理是基於接口的,而CGLIB代理是對class字節碼文件進行的增強處理使代理類繼承了業務類。
2.定義一個切面類如下:
@Aspect 指定一個類爲切面類
@Pointcut("execution(* com.service.UserService.add(..))") 指定切入點表達式
@Before("pointCut_()") 前置通知: 目標方法之前執行
@After("pointCut_()") 後置通知:目標方法之後執行(始終執行)
@AfterReturning("pointCut_()") 返回後通知: 執行方法結束前執行(異常不執行)
@AfterThrowing("pointCut_()") 異常通知: 出現異常時候執行
@Around("pointCut_()") 環繞通知: 環繞目標方法執行
AOP的實現原理
通過代理模式實現的,代理模式是一種常見的設計模式,主要是爲了通過代理來控制被訪問的對象。
根據選擇的不同又分爲兩種實現方式,JDK動態代理和CGLIB代理模式。主要講下JDK動態代理,JDK動態代理實現的時候的業務類需要實現某個接口,然後定義一個InvocationHandler的實現類去實現InvocationHandler接口,通過JDK提供的API,Proxy的newProxyInstance方法來生成一個代理類,在調用代理類的方法的時候其實是通過InvocationHandler中的 invoke方法去調用的,所以我們可以在這個Invoc方法中去做一些事情,比如事務啊這些。
接口:
被代理的業務類:
自定義InvocationHandler的實現類:
測試類: