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/>

猜你喜欢

转载自blog.csdn.net/lx678111/article/details/83310942