zoukankan      html  css  js  c++  java
  • AOP 使用

    AOP 使用
    之前面试经常被问到AOP 使用问题,处理在Filter 使用之外
    还可以设置响应时间:可以用来判断请求响应时间是否在范围之内
    import lombok.extern.slf4j.Slf4j;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.stereotype.Component;
    
    import java.time.LocalDateTime;
    import java.time.ZoneOffset;
    
    @Aspect
    @Component
    @Slf4j
    public class ServiceLogAspect {
    
        /**
         * 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.getSignature().getName(),
                    joinPoint.getSignature().getName());
            log.info("***********************************");
            log.info(String.valueOf(joinPoint.getTarget().getClass()));//指向调用的对象
            log.info(joinPoint.getSignature().getName());// 该方法主要获取被代理对象调用方法名称
            //记录开始时间
            Long begin= LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
            //执行目标
            Object result=joinPoint.proceed();
            //记录结束时间
            Long end= LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
            //时间差
            Long takeTime=end-begin;
            if (takeTime > 3000) {
                log.error("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
            } else if (takeTime > 2000) {
                log.warn("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
            } else {
                log.info("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
            }
            return result;
    
        }
    }

    控制台**************

    INFO DispatcherServlet:524 - Initializing Servlet 'dispatcherServlet'
    INFO DispatcherServlet:546 - Completed initialization in 16 ms
    INFO ServiceLogAspect:40 - ==========开始执行 { }.{ } ==========
    INFO ServiceLogAspect:43 - ***********************************
    INFO ServiceLogAspect:44 - class com.imooc.service.impl.UsersServiceImpl
    INFO ServiceLogAspect:45 - queryUsernameIsExist
    Creating a new SqlSession
    Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@463def2]
    INFO HikariDataSource:110 - DateSourceHikariCP - Starting...
    INFO HikariDataSource:123 - DateSourceHikariCP - Start completed.
    JDBC Connection [HikariProxyConnection@967435781 wrapping com.mysql.jdbc.JDBC4Connection@65c6cb48] will be managed by Spring
    ==> Preparing: select id, username, `password`, nickname, realname, face, mobile, email, sex, birthday, created_time, updated_time from users where username = ?
    ==> Parameters: 222(String)
    <== Total: 0
    Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@463def2]
    INFO ServiceLogAspect:59 - ====== 执行结束,耗时:313 毫秒 ======
    Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@463def2]
    Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@463def2]

  • 相关阅读:
    ET之快递测试法学习感悟20140922
    C#单元测试Nunit小结(20141018)
    oracle数据库导入导出09192255
    Mybatis-Configuration-详解
    Mybatis快速入门
    Ajax的学习笔记(一)
    php curl使用总结(一)
    ETL工具--DataX3.0实战
    SqlServer触发器的理解
    2017年的个人计划
  • 原文地址:https://www.cnblogs.com/yangbom/p/14027473.html
Copyright © 2011-2022 走看看