@Pointcut 使用

Posted Firm陈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@Pointcut 使用相关的知识,希望对你有一定的参考价值。

作用

抽取通用逻辑。

使用

  1. 定义切入点;
  2. 选择合适的切入方法。
    范例(源自参考文章):注意代码中的注释
//@1:这个类需要使用@Aspect进行标注
@Aspect
public class Aspect1 
 
    //@2:定义了一个切入点,可以匹配Service1中所有的方法
    @Pointcut("execution(* com.javacode2018.aop.demo9.test1.Service1.*(..))")
    public void pointcut1() 
    
 
    //@3:定义了一个前置通知,这个通知对刚刚上面我们定义的切入点中的所有方法有效
    @Before(value = "pointcut1()")
    public void before(JoinPoint joinPoint) 
        //输出连接点的信息
        System.out.println("前置通知," + joinPoint);
    
 
    //@4:定义了一个异常通知,这个通知对刚刚上面我们定义的切入点中的所有方法有效
    @AfterThrowing(value = "pointcut1()", throwing = "e")
    public void afterThrowing(JoinPoint joinPoint, Exception e) 
        //发生异常之后输出异常信息
        System.out.println(joinPoint + ",发生异常:" + e.getMessage());
    

定义切入点

切入点,即能通过@PointCut中的模式字符串匹配到的方法。模式字符串有多种写法,可以分为类使用、方法使用、实例使用三类:

方法使用:

  • execution:用于匹配方法执行的连接点
  • args:用于匹配当前执行的方法传入的参数为指定类型的执行方法
  • @args:用于匹配当前执行的方法传入的参数是指定类型的
  • @annotation:用于匹配当前执行方法持有指定注解的方法
  • 切点引入,在切点定义类中对应方法上定义@PointCut,然后在@Aspect类中使用完整方法路径()引用,以分离切点定义和使用,方便切点集中管理

类使用:

  • within:用于匹配指定类内的方法执行
  • this:用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配
  • target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配
  • @within:用于匹配所以持有指定注解的类型内的方法
  • @target:用于配当前目标对象类型的执行方法,其中目标对象持有指定的注解

对象使用:

  • bean:Spring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法

选择合适的切入方法

  • @Before:方法执行前执行
  • @Around:方法执行前后执行
  • @After:在连接点方法完成之后执行,无论连接点方法执行成功还是出现异常,都将执行后置方法
  • @AfterRunning:在方法成功执行返回结果之后执行
  • @AfterThrowing:在方法抛错之后执行

以上是关于@Pointcut 使用的主要内容,如果未能解决你的问题,请参考以下文章

Spring@Pointcut

Spring: error at ::0 can‘t find referenced pointcut的错误并解决

阿里的Spring框架面试题到底有多难?

can't find referenced pointcut myMethod的解决

Spring AOP AspectJ Pointcut 表达式例子

Spring AOP之PointCut详解