用注解来使用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/>