Spring AOP小結
AOP使用方式:XML配置、註解方式(切面的內容)
註解:@Aspect 、@Advice 、@Pointcut
切面表示式Pointcut expression組成:表示式+萬用字元+運算子
匹配方法:
1、execution()
匹配註解:
1、 @target()匹配目標下的方法,要求級別是runtime【@Retention(RetentionPolicy.RUNTIME)】
2、 @args()匹配傳入的引數標註有目標註解的方法
3、 @within()匹配注入目標類底下的方法,要求級別為class【@Target(ElementType.TYPE)】
4、 @annotation()匹配標註有目標註解的方法【方法上有@Target(ElementType.METHOD)】
匹配包/型別:
1、within()
匹配物件:
1、this()匹配AOP物件的目標物件為指定型別的方法,即DemoDao的aop代理物件的方法
2、bean()匹配bean裡面的方法、bean()匹配bean裡面的方法
3、target()匹配目標物件而不是AOP代理後的物件target()匹配目標物件而不是AOP代理後的物件
匹配引數:
1、execution()匹配帶有一些條件的引數
2、args()匹配單一引數【@Pointcut(“args(Long,…) && within(com.ice.service.*)”) 攔截service包下第一個型別是long,後面引數任意型別】
萬用字元
運算子: && 、 || 、 !
五種Advice註解
- @Before 前置通知
- @After(finally),後置通知,方法執行完之後
- @AfterReturning,返回通知,成功執行之後
- @AfterThrowing,異常通知,丟擲異常之後
- @Around,環繞通知
Spring AOP實現原理
aop即面向切面程式設計,程式碼的實質就是代理模式的應用。
代理模式分為以下三種:
- 靜態代理:(JDK代理實現)
- 需要代理哪個方法,就需要在代理類中包裝哪個方法;
- 只能針對有介面的類的介面方法進行動態代理
- 每當代理的方法越多,重複越多;
- 格式:介面 a = new 代理類(new 實現類());a.method();
- 動態代理:
- 基於介面代理、基於繼承代理
- 動態代理,通過實現InvocationHandler介面,重寫invoke方法,利用java的反射實現
- cglib代理
- 實現MethodInterceptor介面
- 通過繼承的方式實現代理,無法對static、final類進行代理
- cglib基於繼承來實現代理,無法對private、static方法進行代理
SpringAOP
- 如果目標物件實現了介面,則預設採用JDK動態代理
- 如果目標物件沒有實現介面,則採用cglib進行動態代理
- 如果目標物件實現了介面,且強制cglib代理,則使用cglib代理
參考:https://blog.csdn.net/u011266694/article/details/78918394
http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html