• spring boot (6) AOP的使用


    常用AOP通知(增强)类型

          * 1. 前置通知:在方法调用之前执行
         * 2. 后置通知:在方法正常调用之后执行
         * 3. 环绕通知:在方法调用之前和之后,都分别可以执行的通知
         * 4. 异常通知:如果在方法调用过程中发生异常,则通知
         * 5. 最终通知:在方法调用之后执行
    切面表达式:
         * execution 代表所要执行的表达式主体
         * 第一处 * 代表方法返回类型 *代表所有类型
         * 第二处 包名代表aop监控的类所在的包
         * 第三处 .. 代表该包以及其子包下的所有类方法
         * 第四处 * 代表类名,*代表所有类
         * 第五处 *(..) *代表类中的方法名,(..)表示方法中的任何参数
       @Around("execution(* com.imooc.service.impl..*.*(..))")

    使用类:

    package com.im.aspect;
    
    import org.aopalliance.intercept.Joinpoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class ServiceLogAspect {
    
        public static final Logger log =
                LoggerFactory.getLogger(ServiceLogAspect.class);
    
        /**
         * AOP通知:
         * 1. 前置通知:在方法调用之前执行
         * 2. 后置通知:在方法正常调用之后执行
         * 3. 环绕通知:在方法调用之前和之后,都分别可以执行的通知
         * 4. 异常通知:如果在方法调用过程中发生异常,则通知
         * 5. 最终通知:在方法调用之后执行
         */
    
        /**
         * 切面表达式:
         * execution 代表所要执行的表达式主体
         * 第一处 * 代表方法返回类型 *代表所有类型
         * 第二处 包名代表aop监控的类所在的包
         * 第三处 .. 代表该包以及其子包下的所有类方法
         * 第四处 * 代表类名,*代表所有类
         * 第五处 *(..) *代表类中的方法名,(..)表示方法中的任何参数
         *
         * @param joinPoint
         * @return
         * @throws Throwable
         */
        @Around("execution(* com.imooc.service.impl..*.*(..))")
        public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {
    
            log.info("====== 开始执行 {}.{} ======",
                            joinPoint.getTarget().getClass(),
                            joinPoint.getSignature().getName());
    
            // 记录开始时间
            long begin = System.currentTimeMillis();
    
            // 执行目标 service
            Object result = joinPoint.proceed();
    
            // 记录结束时间
            long end = System.currentTimeMillis();
            long takeTime = end - begin;
    
            if (takeTime > 3000) {
                log.error("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
            } else if (takeTime > 2000) {
                log.warn("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
            } else {
                log.info("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
            }
    
            return result;
        }
    
    }
  • 相关阅读:
    vue --- 全局弹窗,只调用对应实例
    代理相关;win操作
    mongoBD + node + express
    菜鸟初学 node 推荐 亲测easy
    H5 ---- 点击遍历所有标签,复制对应的文本
    async与await初步应用
    C# Enum 添加自定义Attribute,然后通过泛型与反射的方式得到事先定义的标记
    VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误
    C# 获取数组的内存地址
    利用反射插入数据库与更新数据库
  • 原文地址:https://www.cnblogs.com/guangzhou11/p/12216760.html
Copyright © 2020-2023  润新知