定义AOP切类等
1:需求描述
一个项目基本上至少是有一个aop的,一般是用来监控接口信息,或者是少数时候用来做权限拦截的。
2:代码实现
2.1:引入jar包
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.13</version> </dependency>
2.2:代码
@Component //注入 @Aspect //定义切面类 public class GlobalAspect { private static final Logger logger = LoggerFactory.getLogger(GlobalAspect.class); @Around("requestRest()") public Object doAfter(ProceedingJoinPoint joinPoint) throws Throwable { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes; HttpServletRequest request = servletRequestAttributes.getRequest(); String uri = request.getRequestURI();
long start = System.currentTimeMillis();
Object proceed = joinPoint.proceed();
long costTime = System.currentTimeMillis() - start;
logger.info("方法执行结束,路径:{},耗时:{}ms,参数:{}", uri, costTime, Arrays.toString(joinPoint.getArgs()));
return proceed;
}
@Pointcut("execution(public * com.test.demo.*.*.controller..*.*(..))")
public void requestRest() { } }
3:说明
类上的注解@Aspect:是定义当前类是切面类
doAfter方法上的注解@Around:环绕,顾名思义,joinPoint.proceed();是真正执行方法,我们可以在它上面做点什么,也能在它做完了以后做点什么
requestRest方法上的注解@Pointcut:切点表达式,封装成方法是方便以后增加别的aop,也能直接使用
4:环绕类型
@Before :在方法调用之前进入
@After :在方法执行之后或者是发生了异常后进入
@Around:方法整个过程几乎都有它,方法进入前,进入后等
@AfterReturning:方法返回后进入
@AfterThrowing:方法异常后进入
5:常用切点表达式
5.1.匹配 Test类⾥的所有⽅法:execution(* com.a.b.Test.*(..))
5.2.匹配 com.a包下的所有类的所有⽅法:execution(* com.a.*.*(..))
5.3.匹配 com.a包以及⼦包下所有类的所有⽅法:execution(* com.a..*.*(..))
6:验证
在不启动系统的情况下,验证aop是否对目标有作用
IDEA写完后,左侧会有个m,点击它,如果没有东西 则说明aop没切到,如果有了则说明切到了