引言:
最近在优化代码,想到之前的日志操作,是通过同事封装的组件去做的,这不重要,重要的是我今天准备用spring aop去做这件事情。
环境说明:
文章内容基于maven3.3.9+springboot 2.3.0.RELEASE版本+jdk版本1.8.0_191
实现步骤:
1. 将此类定义为一个切面@Aspect,并将其作为一个组件@Component自动装配。
2. 定义切点 @Pointcut
根据官方文档来看:切点表达式的描述方式(Supported Pointcut Designators)有很多种包括,execution,within,this,@target,@annotation等,可供灵活配置使用。本文将分别说一下关于@annotation和execution的使用。
2.1 @annotation使用较为灵活,这样我们想在哪里切就在哪里切,首先我们自定义注解,用于在运行期间方法描述。
使用方法:在想要写日志的方法上使用自定义的那个注释即可,可以dao层也可以在services层,例子标注在了dao层方法上。
2.2 execution描述举例: 切所有public方法:execution(public * (..)) 切所有以set开头的方法:execution( set*(..))
如果这种基本的表达式不能满足你的需求,没关系,我们还可以使用组合表达式(Combining Pointcut Expressions)。官方解释:You can combine pointcut expressions by using &&, || and !
3. 通知的设置
说白了就是你切到了你想切的方法之后想做什么,比如日志。通知设置分为好几种,本文只写前置和后置。前置就是切之前做的事儿,后置就是切之后做的事儿。就拿日志来说,我们可以通过参数JoinPoint 拿到 请求方法和请求参数等。
结语
文中所写例子与思路只是aop的冰山一角或者说是一个例子,实际需求还是要灵活使用,希望此文章对每一位正在学习aop的同学有所帮助