1. 程式人生 > >Spring aop(5)---註解

Spring aop(5)---註解

用註解來使用spring aop:

一、導包4+2:

二、準備目標物件

三、準備通知

四、配置進行織入,將通知織入目標物件中

       一個公式: 

@Aspect = @Pointcut + (@Before | @After | @Around  | @AfterReturning |@AfterThrowing)

一個注意:

Around通知必須要注入一個ProceedingJoinPoint型別的引數,因為裡面要放行

ProceedingJoinPoint型別的引數 只能在Around通知所對應的攔截方法中使用,其它的通知不行的!

@Aspect
public class MyAdvisor {
	
	@Pointcut(value="execution(* cn..Person.run(..) )")
	public void pc(){//該方法只是給切點註解寄宿和識別,沒有其它功能
	}
	
	@Before(value="pc()")
	public void bf(){
		System.out.println("before.......");
	}
	
	
	@Pointcut(value="execution(* cn..Person.*(..) )")
	public void pc2(){
	}
	@After(value="pc2()")
	public void af(){
		System.out.println("after.......");
	}
	
	@Around(value="pc2()")  
	public Object around(ProceedingJoinPoint p) throws Throwable{
		
		System.out.println("前面攔,資訊:"+p.getKind()+","+p.getSignature().getName()+","+p.getTarget());
		Object returnValue = p.proceed(); //放行
		System.out.println("後面攔....");
		
		return returnValue;
	}
	
	@AfterReturning(value="pc()")
	public void afterReturn(){
		System.out.println("這是呼叫完成,正常返回(沒有捕捉到異常)以後");
	}
	
	@AfterThrowing(value="pc2()")
	public void afterThrowing(){
		System.out.println("這是呼叫完成,發現有異常...");
	}
}

第二版本:

直接宣告一個變數作為切點:private final String CUT= "execution(* cn..Person.run(..) )";

package cn.hncu.aop.annotation;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

//切面=切點+通知,  @Aspect = @Pointcut + (@Before | @After | @Around  | @AfterReturning | @AfterThrowing)

@Aspect
public class MyAdvisor2 {
	//直接宣告一個變數作為切點
	private final String CUT= "execution(* cn..Person.run(..) )";
	
	@Before(value=CUT)
	public void bf(){
		System.out.println("before.......");
	}
	
	@After(value=CUT)
	public void af(){
		System.out.println("after.......");
	}
	
	
	@Around(value=CUT)  
	public Object around(ProceedingJoinPoint p) throws Throwable{
		
		System.out.println("前面攔,資訊:"+p.getKind()+","+p.getSignature().getName()+","+p.getTarget());
		Object returnValue = p.proceed(); //放行
		System.out.println("後面攔....");
		
		return returnValue;
	}

}

配置檔案中要新增如下標籤:

  <!-- 1自動代理標籤。為了讓Spring能夠識別基於註釋的切面,必須要加這個aop標籤 -->    <aop:aspectj-autoproxy/>