1. 程式人生 > >Spring AOP小結

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