一、spring aop的通知类型
1、前置通知(@Before):在连接点前执行,不会影响连接点的执行,除非抛异常;
2、后置通知(@AfterReturning):在连接点正常执行完成后执行,若连接点抛出异常,则不执行;
3、后置通知(@AfterThrowing):在连接点抛出异常后执行;
4、后置通知(@After):在连接点执行完成后执行,不管有无异常,都会执行通知;
5、环绕通知(@Around):在连接点执行前后执行,joinPoint.proceed()之前为前置通知,之后为后置通知。
二、使用环绕通知实现自定义注解日志功能
1、代码结构如下
2、配置文件application.properties
spring.aop.auto = true:开启spring的aop功能
3、用@interface定义一个注解OperateLogAnnotation,即暴露在外的自定义注解
4、定义切面:LogAspect,实现通知的具体内容
a、定义一个切入点,即为第三步顶一个OperateLogAnnotation类
b、定义一个环绕通知的方法,这里调用连接点的proceed()方法,启动目标方法,在该方法前后可添加通知信息。
5、定义一个日志对象,用来保存日志的实例
6、定义两个枚举类,OperateLogAnnotation用到的
7、使用自定义注解
将自定义注解加到service方法上,启动项目,访问 http://localhost:10000/user/findUserNameByTel?tel=1234567 ,控制台打印如下日志
记录日志:OperationLog{id='afd2d9a5-c6ef-434d-9217-fcfc03009d51', createTime=Wed Jul 17 10:13:26 CST 2019, level=3, operationUnit='user', method='com.cyh.service.UserService.findUserName', args='["1234567"]', userId='null', userName='null', describe='null', operationType='select', runTime=2, returnValue='"zhangsan"'}