前面我们已经介绍了AOP适用的一些业务场景以及简单的代码实现,当时我们的切点是用execution表达式来配置的,这种方式有一些局限性在里面:
- 灵活性不高,一个表达式只能切到某种同类型的方法
- 个性化不足,很难对切面切到的所有方法中的一些做一些个性化的设置
这让我想起有以前我还是一个菜鸟时接到的一个需求,要在所有接口中记录请求日志,因为项目比较老了,所以接口还是挺多的,我预估需要三天才能完成,我们老大鄙视了我一眼,然后花半小时就完成了。
今天我们就来讲讲切点的另一种配置方式:@annotation,通过@annotation配置切点,我们可以灵活的控制切到哪个方法,同时可以进行一些个性化的设置,今天我们就用它来实现一个记录所有接口请求功能吧。
首先来看看我们要实现的效果
通过结果我们可以看到,我们的自定义注解EagleEye做到了统一的记录下了请求链接、请求类型、请求IP、请求入参、请求耗时、请求返回等信息。
是不是感觉还不错呢?下面我们就来一起动手实现它吧!
添加依赖
新建一个Spring Boot项目,打开pom.xml文件添加相关Maven依赖:
自定义一个注解
我们定义了一个注解,定义注解使用@interface:
- 定义了注解的生命周期为运行时
- 定义了注解的作用域为方法
- 标识该注解可以被JavaDoc记录
- 定义注解名称为EagleEye(鹰眼,哈哈~~)
- 定义一个元素desc,用来描述被修饰的方法
注解虽然定义好了,但是还用不了,因为没有具体的实现逻辑,接下来我们用AOP实现它。
配置AOP切面
首先我们定义切点:
我们通过@annotation来配置切点,代表我们的AOP切面会切到所有用EagleEye注解修饰的类。
接下来我们利用@Around环绕增强来实现我们的功能:
- 首先我们先记录请求链接、接口描述、请求类型、请求IP、请求入参信息
- 接着执行我们注解切到的原方法逻辑
- 最后我们记录整个请求耗时、返回结果
OK,到这里,我们就完成了利用AOP自定义注解的所有步骤。
怎么使用自定义注解?
修饰Controller里的接口方法:
修饰Service里的方法:
对于需要AOP增强的方法,我们只需要:
- 在方法上加上@EagleEye注解
- 通过desc元素设置方法的描述
接下来启动应用,请求接口看一下控制台输出是不是像我们开头贴出的那样吧。