简述
AOP,即一种切面编程,可对目标起到一定的增强作用,AOP可用于日志记录,事务操作等;AOP的作用目标颗粒度是方法,可以注解@Pointcut 作切点定义,今天就讲一下注解值中使用execution方式的一些注意点。(阅读本文1分钟)
实践
1、引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.5.3</version>
</dependency>
2、execution 可作用在包名、类名、模糊方法上,请看下面示例:
@Slf4j
@Aspect
@Component
public class LogAspect {
//作用在指定类上
@Pointcut(value = "execution(public * com.demo.ypk.mybatisplus.controller.TestController.*(..))")
public void log() {
}
/**
* 环绕通知
* @param joinPoint
* @return
*/
@Around(value = "log()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("------------------打印入参-----------------");
log.info(new ObjectMapper().writeValueAsString(joinPoint.getArgs()));
return joinPoint.proceed();
}
}
启动项目,请求接口
http://localhost:8080/get?name=%E5%A5%A5%E6%9C%AF%E5%A4%A7%E5%B8%88%E5%A4%9A&age=34
3、接口上变化一下,在接口方法中再调用一个public方法,按照execution切点的定义是可作用在TestController类的所有public方法
这其实是符合事实的,切点虽然定了可作用于所有public方法,但AOP作用的是代理类的方法,像上面这种情况直接调用同类方法是不走代理类的,因此AOP作用不到;
下面我们再变化一下即可达到我们的预期:
OK,此文实践重在提醒各位道友AOP生效的关键点—代理。不管是CGLIB还是JDK代理。