1. 程式人生 > >Spring 重用切入點定義表示式

Spring 重用切入點定義表示式

例項如下:

這下面的各類通知方法都是引用一個類的申明

我們可以使用@Pointcut來把重複的部分放在一個方法上

     //切面申明優先順序表示式
    @Pointcut("execution(public int cn.com.day01.CalculatorImp.*(int, int))")
      public void decale(){
      }

以下有幾類情況

1、在一個類裡面

@Before("decale()")   括號裡面("方法名")

2、在一個包下面,不在一個類裡面

@Around("AspectClass.decale()")括號裡面("類名.方法名")

3'不在一個包下面

括號裡面("包名.類名.方法名")

package cn.com.day01;
import java.util.Arrays;
import java.util.List;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
//切面優先順序,值越小,優先順序越高
@Order(1)
@Component
@Aspect
public class AspectClass {
	
	// author:命運的信徒 date:2018/12/21 arm:切面	 
	 //切面申明優先順序表示式
	@Pointcut("execution(public int cn.com.day01.CalculatorImp.*(int, int))")
	  public void decale(){
	  }
	  
	// 1.把該類加入到IOC容器中並且申明為AspectJ 切面
	
	//@Befor的意思是在方法執行執行先執行這個 execution是執行的意思 (公共/私有/受保護 資料型別 類名.方法(引數型別 引數))
	
	@Before("decale()")
	public void getLogging(JoinPoint joinpoint) {
		// 根據連線點獲取方法名
		String methodname = joinpoint.getSignature().getName();
		// 獲取引數名稱
		List<Object> args = Arrays.asList(joinpoint.getArgs());
		System.out.println("the method " + methodname + "is begins with "
				+ args);
	}
	//在方法結束後執行,無論有沒有異常發生都會執行的!但是這個方法是顯示不了返回值,需要在返回通知裡顯示
	@After("decale()")
   public void after(JoinPoint joinpoint){
		String name=joinpoint.getSignature().getName();
		System.out.println("the method " + name + "is end");
		
	}
	//返回通知
	//只有在正常執行的情況下才會執行的,這個方法可以返回結果值
 
	 
	@AfterReturning(value="decale()",returning="result")
	public void afterReturn(JoinPoint joinpoint,Object result){
		String name=joinpoint.getSignature().getName();
		System.out.println("the method " + name + "is end"+result);
		
	}
	//異常通知,只有報錯的時候才會執行的方法,可以訪問到異常
	@AfterThrowing(value="decale()",throwing="ex")
	public void afterThrow(JoinPoint joinpoint,Exception ex){
		String name=joinpoint.getSignature().getName();
		System.out.println("the method " + name + "is throw error"+ex);
		
	}
}