定义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没切到,如果有了则说明切到了

 

posted @ 2022-08-23 17:31  鸭猪是的念来过倒  阅读(96)  评论(0编辑  收藏  举报