SpringBoot中定位切点的两种常用方法
作者:LukeLong 发布时间:2023-09-26 08:45:17
有时候,我们使用AOP来进行放的增强,编写切面类的时候,需要定位在哪个方法上试用该切面进行增强,本片文章主要讲解两种在SpringBoot中定位切点的方法,一种是使用execution表达式的方法,一种则是利用自定义注解的方法。
接下来以一个简单的例子来讲解这两种方法的使用方式。
<==========方法执行前==========>
method();
<==========方法执行后==========>
execution 表达式
execution表达式的方式主要是在定义切点的时候,通过表达式的方式选取到所需要增强的方法。
execution表达式解读
execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)
类型 | 解读 | 是否必须 | 示例 |
---|---|---|---|
<修饰符模式> | 表示所选的修饰符类型 | 否 | public/private/... |
<返回类型模式> | 表示所选的返回值类型 | 是 | void/int/... |
<方法名模式> | 表示所选的包或者方法 | 是 | com.luke.service/com.luke.controller.*/... |
(<参数模式>) | 表示所选方法的参数 | 是 | *(..)/*(String name)/*(int size, ..)/... |
<异常模式> | 表示所选方法的异常类型 | 否 | throws Exception/... |
// 匹配指定包中的所有方法
execution(* com.luke.service.*(..))
// 匹配当前包中的所有public方法
execution(public * UserService.*(..))
// 匹配指定包中的所有public方法,并且返回值是int类型的方法
execution(public int com.luke.service.*(..))
// 匹配指定包中的所有public方法,并且第一个参数是String,返回值是int类型的方法
execution(public int com.luke.service.*(String name, ..))
自定义切面类:
@Aspect
@Component
public class LogAspect {
@Pointcut("execution(* com.luke.springdata.controller.*.*(..))")
public void operationLog(){}
/**
* 这里只定义一个Around的增强做展示
*/
@Around("operationLog()")
public Object doAround(ProceedingJoinPoint joinPoint) {
Object proceed = null;
try {
System.out.println("方法执行前");
proceed = joinPoint.proceed();
System.out.println("方法执行后");
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return proceed;
}
}
此切点的execution表达式为com.luke.springdata.controller包下的所有方法。
使用**@Around**注解表明增强的方法,并且指定切点。
测试用Controller类
@RestController
@RequestMapping("/person")
public class PersonController {
@GetMapping("/test")
public void test(){
System.out.println("方法执行了");
}
}
运行项目,调用该方法,查看结果。
方法执行前
方法执行了
方法执行后
自定义注解的方法
自定义注解的方式就是在需要增强的方法上面加上自定义的注解即可。
自定义注解类:
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Log{
}
这里自定义了一个注解Log,该注解只能加在方法上。
自定义切面类:
@Aspect
@Component
public class LogAspect {
@Pointcut("@annotation(com.luke.springdata.annotation.Log)")
public void operationLog(){}
/**
* 这里只定义一个Around的增强做展示
*/
@Around("operationLog()")
public Object doAround(ProceedingJoinPoint joinPoint) {
Object proceed = null;
try {
System.out.println("方法执行前");
proceed = joinPoint.proceed();
System.out.println("方法执行后");
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return proceed;
}
}
这里编写的自定义个切面类,用**@Pointcut注解定义一个切面,并且这次采用@annotation(xxx)**的方式表明如果哪个方法上添加了xxx注解,则就使用该切面做增强。
同时在每个增强的方法上使用该切面,随后编写正常的方法增强逻辑即可。
测试用Controller类
@RestController
@RequestMapping("/person")
public class PersonController {
@Log
@GetMapping("/test")
public void test(){
System.out.println("方法执行了");
}
}
此时在需要使用切面的方法上加入**@Log**注解,调用该方法,查看效果。
方法执行前
方法执行了
方法执行后
总结
两种方式均能实现AOP的功能,在使用上,如果某个包下面的所有方法,都需要这个切面进行增强,那么使用execution表达式的方式更方便。但如果只有部分方法需要,并且分布在不同的类中,则注解的方式更灵活。
来源:https://juejin.cn/post/6971606712281219086


猜你喜欢
- 在C#中用同一个dataset保存从数据库中取出的多张表:cmd.CommandText = "select * from tab
- 本文介绍了使用C#创建Windows服务的实例代码,分享给大家一、开发环境操作系统:Windows 10 X64开发环境:VS2015编程语
- 一、interrupt的使用特点我们先看2个线程打断的示例首先是可打断的情况:@Testpublic void interruptedTes
- 机器跑了一晚上,发现有崩溃现象,由于页面内有动态绘图功能,我怀疑是绘图原因,但是今天上午有人提醒我才想到,是不是间隔调用时DWR产生了内存泄
- 在应用C#进行Winform窗体程序编写的时候,经常需要编写工具栏。下面小编给大家分享一下C#如何应用ToolSctrip控件编写工具栏。1
- 上一篇介绍了elasticsearch的client结构,client只是一个门面,在每个方法后面都有一个action来承接相应的功能。但是
- 本文实例讲述了Java简单实现约瑟夫环算法。分享给大家供大家参考,具体如下:1.算法背景:罗马人攻占了乔塔帕特,41人藏在一个山洞中躲过了这
- 线程间通信:由于多线程共享地址空间和数据空间,所以多个线程间的通信是一个线程的数据可以直接提供给其他线程使用,而不必通过操作系统(也就是内核
- 本文实例讲述了C++二分查找(折半查找)算法。分享给大家供大家参考,具体如下:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好
- 服务提供者@GetMapping("/{id}") public void queryJobInfoLogD
- 1 pom.xml文件注:热部署功能spring-boot-1.3开始有的<!--添加依赖--><dependency&g
- 在框架开发过程中,通用代码生成是一项必不可少的功能,c#在这后端模板引擎这方面第三方组件较少,我这里选择的是NVelocity,现在升级到了
- LockSupport 简介LockSupport 是 Java 并发编程中一个非常重要的组件,我们熟知的并发组件 Lock、线程池、Cou
- 目录一.什么是负载均衡二.负载均衡的简单分类三.为什么需要做负载均衡四.springCloud如何开启负载均衡五.IRule1.Random
- 布局中listview要覆盖标题栏 int mTouchSlop = ViewConfiguration.get(this).getScal
- web.xml文件配置创建好一个SpringMVC项目后,需要在需要在WB-INF文件夹下配置web.xml文件<?xml versi
- spring boot ${}占位符不起作用问题:在 pom.xml 文件里定义好属性标签,然后在 properties或者xml 中使用$
- 1.前置准备默认服务器上的hadoop服务已经启动本地如果是windows环境,需要本地配置下hadoop的环境变量本地配置hadoop的环
- 本文实例为大家分享了C#实现图片切割、切图的具体代码,供大家参考,具体内容如下前台准备两个Image控件。上面是显示原图,下面显示切割后的效
- 一、下载客户端代码package javadownload; import java.io.ByteArrayOutputStream; i