初識Spring-AOP
什麼是AOP
Spring-AOP是一種動态編譯期增強性AOP的實作, 與IOC進行整合,不是全面的切面架構 與動态代理相輔相成
- AOP(Aspect-oriented programming)是面向切面的程式設計。
- Spring架構中一個重要内容可與提高代碼的靈活性和可拓展性
- 函數式程式設計的一種衍生範型,利用AOP可以對業務邏輯的各個部分進行隔離
目标類 + 額外功能 = 代理類
- 通過spring AOP的代理功能,給代碼增加額外的通用功能
- 業務邏輯就專心的處理實際需求,通用的增強功能獨立出來
-
代理的專業術語
額外功能叫 增強
目标類叫 切入點 或 切面
将增強 加入到 切入點,叫編織
主要功能:
- 日志記錄,性能統計,安全控制,事務處理,異常處理等等。
切面:
- 切面(Aspect) :通知和切入點共同組成了切面,時間、地點和要發生的"故事"。
切入點:
- 通知定義了切面要發生的"故事"和時間,那麼切入點就定義了“故事”發生的地點,例如某個類或方法的名稱。
目标對象:
即被通知的對象。
編織:
<!--AOP配置 編織-->
<aop:config>
<!--指定切入點 面 (* com.gxy.service.ProductService.*(..)) -->
<!--編織 -->
<!--前置增強 -->
<aop:advisor advice-ref="myBeforeAdvice" pointcut-ref="myPoinCut"/> -->
<!--後置增強 -->
<aop:advisor advice-ref="myAfterAdvice" pointcut-ref="myPoinCut"/> -->
<!--異常增強 -->
<aop:advisor advice-ref="myThrowsAdvice" pointcut-ref="myPoinCut"/> -->
<!--環繞增強 -->
<aop:advisor advice-ref="myInterceptor" pointcut-ref="myPoinCut"/>
</aop:config>
額外功能:
增強
-
前值增強:
表示在目标方法執行前實施增強。
public class MyBeforeAdvice implements MethodBeforeAdvice{
//前置增強
@Override
public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
System.out.println("this is 前置增強") ;
//擷取目标方法名稱
String method = arg0.getName();
System.out . println("the method:"+method);
//擷取目标方法參數的實參清單
for(int i=0; i<arg1. length;i++) {
System.out.println("the arg1:"+arg1[i]);
}
//擷取目标實作類的類路徑
System.out.println("the arg2:"+arg2. getClass());
}
}
-
後置增強:
表示目标方法在執行後實施增強
public class MyAfterAdvice implements AfterReturningAdvice{
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
System.out.println("this is 後置增強");
//擷取反參參數的類型
System.out.println("the arg0:"+arg0.getClass());
System.out.println("the arg1:"+arg1.getName());
//擷取目标方法參數的實參清單
for(int i=0;i<arg2. length;i++) {
System.out.println("the arg2:"+arg2[i]);
}
//擷取目标實作類的類路徑
System.out.println("the arg3:"+arg3.getClass());
}
}
-
環繞增強:
表示目标方法執行前後實施增強
public class MyInterceptor implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
System. out. println("this is 環繞增強");
//擷取目标實作類對象
System.out.println("arg0.getThis()"+arg0.getThis().getClass().toString());
//擷取目标方法名
System.out.println("arg0.getMethod():"+arg0.getMethod().getName());
//擷取目标方法參數的實參清單
Object[] arguments = arg0.getArguments();
for(int i=0; i<arguments .length;i++) {
System.out . println("arg0.getArguments():"+arguments[i]);
}
//由于啟動了環繞增強,目标類的方法将不會被執行,而被. proceed職代,并傳回目标類的反參
//執行目标方法
Object object = arg0.proceed();
return object;
}
-
異常增強:
表示目标方法抛出異常後實施增強
public class MyThrowsAdvice implements ThrowsAdvice{
//異常增強
public void afterThrowing(Method method, Object[] args, Object target,Exception ex){
System.out.println(target+"裡面的"+method.getName()+"産生了"+ ex.getMessage());
}
}
總結:
AOP是spring架構的重要組成部分。AOP是以另一個角度來考慮程式結構,通過分析程式結構的關注點來完善面向對象程式設計(OOP)。OOP将應用程式分解成各個層次的對象,而AOP将程式分解成多個切面。spring AOP 隻實作了方法級别的連接配接點,在J2EE應用中,AOP攔截到方法級别的操作就已經足夠。在spring中,未來使IOC友善地使用健壯、靈活的企業服務,需要利用spring AOP實作為IOC和企業服務之間建立聯系。