springboot aop里的@Pointcut()的配置方式

作者:wzng 时间:2021-11-18 20:55:37 

springboot aop里的@Pointcut()的配置


@Pointcut("execution(public * com.wangzhou.newboot.exception.TestExceptionController.test(String,String))")

com.wangzhou.newboot.exception是TestExceptionController类的全路径,test(String,String)是TestExceptionController类下的

test(String s,String d)方法

如果要忽略test方法的入参,所有test方法将被aop


@Pointcut("execution(public * com.wangzhou.newboot.exception.TestExceptionController.test(..))")

如果忽略TestExceptionController的方法,所有TestExceptionController下的方法将被aop


@Pointcut("execution(public * com.wangzhou.newboot.exception.TestExceptionController.*(..))")

如果忽略exception路径下的所有类,不包括exception的子路径


@Pointcut("execution(public * com.wangzhou.newboot.exception.*.*(..))")

如果忽略newboot路径下的所有类,不包括newboot的子路径比如exception里的类,


@Pointcut("execution(public * com.wangzhou.newboot..*.*(..))")

springboot aop @Pointcut的用法

格式:


execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)

括号中各个pattern分别表示:

  • 修饰符匹配(modifier-pattern?)

  • 返回值匹配(ret-type-pattern)可以为*表示任何返回值,全路径的类名等

  • 类路径匹配(declaring-type-pattern?)

  • 方法名匹配(name-pattern)可以指定方法名 或者 *代表所有, set* 代表以set开头的所有方法

  • 参数匹配((param-pattern))可以指定具体的参数类型,多个参数间用“,”隔开,各个参数也可以用“*”来表示匹配任意类型的参数,如(String)表示匹配一个String参数的方法;(*,String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;可以用(..)表示零个或多个任意参数

  • 异常类型匹配(throws-pattern?)

  • 其中后面跟着“?”的是可选项

现在来看看几个例子:


1)execution(* *(..))  
//表示匹配所有方法  
2)execution(public * com. savage.service.UserService.*(..))  
//表示匹配com.savage.server.UserService中所有的公有方法  
3)execution(* com.savage.server..*.*(..))  
//表示匹配com.savage.server包及其子包下的所有方法

在Spring 2.0中,Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature)


//Pointcut表示式
@Pointcut("execution(* com.savage.aop.MessageSender.*(..))")
//Point签名
private void log(){}

然后要使用所定义的Pointcut时,可以指定Pointcut签名

如下:


@Before("og()")

这种使用方式等同于以下方式,直接定义execution表达式使用


@Before("execution(* com.savage.aop.MessageSender.*(..))")

Pointcut定义时,还可以使用&&、||、! 这三个运算


@Pointcut("execution(* com.savage.aop.MessageSender.*(..))")
private void logSender(){}
@Pointcut("execution(* com.savage.aop.MessageReceiver.*(..))")
private void logReceiver(){}
@Pointcut("logSender() || logReceiver()")
private void logMessage(){}

这个例子中,logMessage()将匹配任何MessageSender和MessageReceiver中的任何方法。

还可以将一些公用的Pointcut放到一个类中,以供整个应用程序使用,如下:


package com.savage.aop;
import org.aspectj.lang.annotation.*;
public class Pointcuts {
@Pointcut("execution(* *Message(..))")
public void logMessage(){}
@Pointcut("execution(* *Attachment(..))")
public void logAttachment(){}
@Pointcut("execution(* *Service.*(..))")
public void auth(){}
}

在使用上面定义Pointcut时,指定完整的类名加上Pointcut签名就可以了,如:


package com.savage.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
@Aspect
public class LogBeforeAdvice {
@Before("com.sagage.aop.Pointcuts.logMessage()")
public void before(JoinPoint joinPoint) {
System.out.println("Logging before " + joinPoint.getSignature().getName());
}
}

当基于XML Sechma实现Advice时,如果Pointcut需要被重用,可以使用<aop:pointcut></aop:pointcut>来声明Pointcut,然后在需要使用这个Pointcut的地方,用pointcut-ref引用就行了,如:


<aop:config>
<aop:pointcut id="log" expression="execution(* com.savage.simplespring.bean.MessageSender.*(..))"/>
<aop:aspect id="logging" ref="logBeforeAdvice">
<aop:before pointcut-ref="log" method="before"/>
<aop:after-returning pointcut-ref="log" method="afterReturning"/>
</aop:aspect>
</aop:config>

另外,除了execution表示式外,还有within、this、target、args等Pointcut表示式

来源:https://blog.csdn.net/qq_38522268/article/details/92846323

标签:springboot,aop,@Pointcut()
0
投稿

猜你喜欢

  • grails不能运行fork模式解决方法

    2023-05-17 18:37:59
  • SpringCloud微服务架构实战之微服务治理功能的实现

    2023-07-20 09:06:38
  • Feign远程调用Multipartfile参数处理

    2022-09-22 02:46:24
  • C语言近万字为你讲透树与二叉树

    2022-04-30 17:48:19
  • Spring boot整合mybatis实现过程图解

    2023-01-15 09:31:05
  • C#如何快速释放内存的大数组详解

    2021-12-14 18:42:33
  • Android开发之全屏与非全屏的切换设置方法小结

    2021-07-05 04:10:13
  • Flutter实现矩形取色器的封装

    2023-06-19 04:08:47
  • Java 中的变量类型

    2022-05-27 20:00:19
  • python、java等哪一门编程语言适合人工智能?

    2021-06-04 03:22:53
  • spring异步service中处理线程数限制详解

    2021-09-02 23:20:12
  • SpringBoot结合Neo4j自定义cypherSql的方法

    2022-05-18 00:41:07
  • springboot从application.properties中注入list, map方式

    2023-11-28 23:42:33
  • 基于Android实现百度地图定位过程详解

    2021-06-12 20:55:34
  • 详解如何在C#中接受或拒绝Excel中的修订

    2023-06-19 21:08:29
  • 关于springboot配置文件密文解密方式

    2023-11-09 04:21:24
  • C#中实现AES算法加密解读

    2022-09-17 16:49:36
  • C++ 线程(串行 并行 同步 异步)详解

    2023-07-18 18:09:43
  • Logback 使用TurboFilter实现日志级别等内容的动态修改操作

    2022-06-10 04:17:53
  • Java访问Hadoop分布式文件系统HDFS的配置说明

    2021-11-20 05:53:42
  • asp之家 软件编程 m.aspxhome.com