概述

(个人记录)

下面说说在Spring中使用AOP输出日志,纯注解版。
在censor-es里面,居然发现了一块使用AOP输出日志的代码,记录一下。
要使用spring的AOP,首先得在该类上加入注解:@Aspect
这个类叫做切面

实践

    @Pointcut("@annotation(com.pc.censor.es.log.annotation.InterfaceTimeStatistics)")
    public void pointcut() {
    }

这样就定义了一个切入点,它的意思是:标注了某个注解的所有方法
一个切面里面可以定义多个切入点。

    @Around("pointcut()")
    public Object recordLog(ProceedingJoinPoint point) throws Throwable {
        // ...
    }

然后,在recordLog方法上配置了一个环绕通知@Around

通知的类型

环绕通知

介绍一下各种通知的形式,首先说说上面使用到的环绕通知。

环绕通知:可以自定义目标方法调用的时机。
使用ProceedingJoinPoint point的point.proceed()来决定。

异常通知

其实项目中还有一个异常通知@AfterThrowing

    @AfterThrowing(pointcut = "pointcut()", throwing = "e")
    public void logAfterThrowing(JoinPoint point, Throwable e) {
        System.out.println("出错啦!" + e.getMessage());
        log.error("{}",e.toString());
    }

它的意思是,如果目标方法(也叫连接点?JoinPoint)出现了异常,抛出的异常就是方法参数的Throwable,具体的处理则是在这个方法里面。在这个方法中,它只是打印了一下日志。(这个具体做法可以自定义)。

前置通知

在执行目标方法前运行。

后置通知

在执行目标方法后运行。

返回通知

在目标方法正常返回值后运行。
它带一个返回值


回到环绕通知那里,现在找一个Controller类,写一个测试方法。

    @GetMapping("/index/hello")
    @InterfaceTimeStatistics(interfaceName = "myInterface")
    public void t() {
        System.out.println("这是一句话"); 
    }

我加了@InterfaceTimeStatistics这个注解,这就说明这个t()方法被加入了环绕通知和异常通知。
我特意在环绕通知的前后加入了一句话。

System.out.println("这是环绕通知,它在point.proceed()前");
System.out.println("这是环绕通知,它在point.proceed()后");

下面运行一下,然后看看结果会怎样。

这是环绕通知,它在point.proceed()前
这是一句话
这是环绕通知,它在point.proceed()后

没问题!
我们再把那个改改,制造一个异常。

System.out.println(1/0);

这是环绕通知,它在point.proceed()前
出错啦!/ by zero

这样还挺方便的?使用注解方式的方式在切入点中加入通知,这样想要监控哪个注解的方法就能监控哪个。

其它方法

其实在一开始学AOP的时候,遇到的并不是这个,而是需要自己指定连接点,就是自己指定要加入的方法了。

	@Pointcut("execution(* com.aop.service.*.*(..))")
	public void pointCut() {}
  • execution表示方法执行时会触发
  • 第一个*表示任意的返回值(*是通配符)
  • 第二个*表示在包com.aop.service下的任意类
  • 第三个*接上,是该类的任意方法
  • (..)表示方法的参数,这里指任意

PS:可以像这样配置切入点,然后在使用通知的时候,直接调那个方法就行,例如:
@Around("pointCut()")

当然,你也可以直接@Around("execution(* com.aop.service.*.*(..))"),两者等价。

其它的与上面的实践差不多。

小结

spring aop部分的内容应该不止这么少,它还有其它一些用法,比如把参数传到通知方法里面、别的参数的使用等等,用到再总结。
现在列举的情况对于基本的使用是够了,让我自己加一个日志功能都可以了2333333333333