天天看點

初識Spring-AOP初識Spring-AOP

初識Spring-AOP

什麼是AOP

Spring-AOP是一種動态編譯期增強性AOP的實作, 與IOC進行整合,不是全面的切面架構 與動态代理相輔相成

  • AOP(Aspect-oriented programming)是面向切面的程式設計。
  • Spring架構中一個重要内容可與提高代碼的靈活性和可拓展性
  • 函數式程式設計的一種衍生範型,利用AOP可以對業務邏輯的各個部分進行隔離

目标類 + 額外功能 = 代理類

  1. 通過spring AOP的代理功能,給代碼增加額外的通用功能
  2. 業務邏輯就專心的處理實際需求,通用的增強功能獨立出來
  3. 代理的專業術語

    額外功能叫 增強

    目标類叫 切入點 或 切面

    将增強 加入到 切入點,叫編織

主要功能:
  • 日志記錄,性能統計,安全控制,事務處理,異常處理等等。
切面:
  • 切面(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和企業服務之間建立聯系。