1. 程式人生 > 其它 >spring 之 AOP

spring 之 AOP

技術標籤:springaop

基於註解開發切面

AspectJ aop開發的開源框架 支援註解開發和xml配置

aspectJ 註解開發簡例

要在 Spring 應用中使用 AspectJ 註解 , 必須在 classpath 下包含 AspectJ 類庫 : aopalliance.jar aspectj.weaver.jar spring-aspects.jar aop Schema 新增到 <beans> 根元素中 . Spring IOC 容器中啟用 AspectJ
註解支援 , 只要 Bean 配置檔案中定義一個空的 XML 元素 < aop:aspectj-autoproxy > Spring IOC 容器偵測到 Bean 配置檔案中的 < aop:aspectj-autoproxy > 元素時 , 會自動為與 AspectJ 切面匹配的 Bean 建立代理 .

<!-- 使 AspectJ 的註解起作用 -->
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

切面類:

@Aspect
public class LoggingAspect {

	@Before("execution(具體切入點或者切入點表示式)")
	public void beforeMethod(JoinPoint joinPoint){
		
     此處實現切面需要實現的內容

       }
	
	@After("execution(具體切入點或者切入點表示式)
	public void afterMethod(JoinPoint joinPoint){
	    此處實現切面需要實現的內容
	
     }
通知是標註有某種註解的簡單的 Java 方法 .AspectJ 支援 5 種類型的通知註解 : @Before: 前置通知 , 在方法執行之前執行@After: 後置通知 , 在方法執行之後執行 @ AfterRunning : 返回通知 , 在方法返回結果之後 執行@ AfterThrowing : 異常通知 , 在方法丟擲異常之後@Around: 環繞通知 , 圍繞著方法執行

最典型的切入點表示式時根據方法的簽名來匹配各種方法:

execution * com.hd.cyz.ArithmeticCalculator
. * (..): 匹配 ArithmeticCalculator 中宣告的所有方法 , 第一個 * 代表任意修飾符及任意返回值 . 第二個 * 代表任意方法 . .. 匹配任意數量的引數 . 若目標類與介面與該切面在同一個包中 , 可以省略包名 .execution public * ArithmeticCalculator.*(..): 匹配 ArithmeticCalculator 介面的 所有公有方法 .execution public double ArithmeticCalculator.*(..): 匹配 ArithmeticCalculator 返回 double 型別數值的方法execution public double ArithmeticCalculator.*( double , ..): 匹配第一個引數為 double 型別的方法 , .. 匹配任意數量任意型別的引數execution public double ArithmeticCalculator.*( double , double ): 匹配引數型別為 double, double 型別的方法 .

在同一個連線點上應用不止一個切面時 , 除非明確指定 , 否則它們的優先順序是不確定的 .切面的優先順序可以通過實現 Ordered 介面或利用 @Order 註解指定 .實現 Ordered 介面 , getOrder () 方法的返回值越小 , 優先順序越高 .若使用 @Order 註解 , 序號出現在註解中 入: @Order(0), @Order(1)