• 【SSM】整合AOP,日志框架和拦截器


    前言

          日志是所有系统必不可少的部分,而AOP在MVC通常用于监控方法调用,可以生成一个traceid,记录从用户调用到底层数据库的数据链路,帮助监控和排查问题。

    AOP

        现在做一个简单的前置切面,用来记录方法和入参,需要修改如下文件

       

    public class ControllerAspect {
    
        private final static org.slf4j.Logger logger = LoggerFactory.getLogger(ControllerAspect.class);
    
        public void before(JoinPoint joinPoint) {
            MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
            System.out.println("方法名:"+methodSignature.getMethod().getName()+" 参数列表:"+ArrayToParameterString(methodSignature.getParameterNames(),joinPoint.getArgs()));
        }
        private  String ArrayToParameterString(String[] parameterNames,Object[] parameterValues) {
            StringBuffer sb = new StringBuffer();
            if (parameterNames != null && parameterNames.length > 0) {
                for (int i = 0; i < parameterNames.length; i++) {
                    sb.append(parameterNames[i]);
                    sb.append(":");
                    sb.append(parameterValues[i]);
                    sb.append(";");
                }
            }
            return sb.toString();
        }
    }
    ControllerAspect.java

    两个pom.xml需要加入依赖,如

      <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>5.1.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>5.1.5.RELEASE</version>
       </dependency>

    applicationContext.xml需要加入以下配置

      <bean id="controllerAspect" class="cn.com.test.springmvc.common.aop.ControllerAspect">
        </bean>
    
        <aop:config>
            <aop:aspect ref="controllerAspect">
                <aop:pointcut id="controlPointcut" expression="execution(* cn.com.test.springmvc.web.*.*(..))"></aop:pointcut>
                <aop:before method="before" pointcut-ref="controlPointcut"></aop:before>
            </aop:aspect>
        </aop:config>

    dispatcher-servlet.xml需要加入以下配置

     <aop:aspectj-autoproxy proxy-target-class="true"/>

    运行后可以看到控制台有输出,如下

    方法名:getDeptList 参数列表:name:null;

    日志

         日志框架加入和使用也比较简单,需要修改如下文件

    public class ControllerAspect {
    
        private final static org.slf4j.Logger logger = LoggerFactory.getLogger(ControllerAspect.class);
    
        public void before(JoinPoint joinPoint) {
            MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
            logger.info("方法名:"+methodSignature.getMethod().getName()+" 参数列表:"+ArrayToParameterString(methodSignature.getParameterNames(),joinPoint.getArgs()));
        }
        private  String ArrayToParameterString(String[] parameterNames,Object[] parameterValues) {
            StringBuffer sb = new StringBuffer();
            if (parameterNames != null && parameterNames.length > 0) {
                for (int i = 0; i < parameterNames.length; i++) {
                    sb.append(parameterNames[i]);
                    sb.append(":");
                    sb.append(parameterValues[i]);
                    sb.append(";");
                }
            }
            return sb.toString();
        }
    }
    ControllerAspect.java

    需要加入依赖,如

     <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.8.0-alpha2</version>
      </dependency>

    还有日志配置,配置日志级别,输出目录等

    log4j.rootLogger=INFO,FILE,stdout
    #file
    log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender 
    log4j.appender.FILE.DatePattern='.'yyyy-MM-dd
    log4j.appender.FILE.File=./logs/out.log
    log4j.appender.FILE.Append=true
    log4j.appender.FILE.Threshold=DEBUG
    log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 
    log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ] %p:%m%n
    
    
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
    log4j.appender.stdout.layout.ConversionPattern= [%d{yyyy-MM-dd HH:mm:ss a}]:%p %l%m%n

    运行后,可以在控制台看到日志输出和在Tomcat的目录bin下面看到日志文件。

    拦截器

         拦截器其实也是aop思想中的一种实现,可以看成是特定于controller层的aop,根据对request和Reponse做更细化的处理,加入拦截器需要修改以下文件

    public class ControllerInterceptor extends HandlerInterceptorAdapter {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("链接是"+request.getRequestURL().toString());
            return true;
        }
    }
    ControllerInterceptor.java

    pom.xml加入依赖

      <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.0.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.1.0</version>
            </dependency>

    dispatcher-servlet.xml需要加入以下配置

       <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <bean class="cn.com.test.springmvc.common.interceptor.ControllerInterceptor"></bean>
            </mvc:interceptor>
        </mvc:interceptors>

    运行后可以看到

    链接是http://localhost:8080/dept/getList

    小结

          本文只是简单演示了aop和日志和拦截器的功能,这只是冰山一角,AOP的功能不止这样的。

  • 相关阅读:
    Excel 之查找与替换
    重拾Excel之为什么
    taobao
    祝我生日快乐
    啊哈哈哈哈!自由啦
    我是不是得了抑郁症?
    Be quiet
    tcpdump tutorial
    Java Thread 多线程同步、锁、通信
    java 堆、栈、常量池等
  • 原文地址:https://www.cnblogs.com/caizl/p/10563826.html
Copyright © 2020-2023  润新知