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的功能不止这样的。
SSM整合AOP,日志框架和拦截器的更多相关文章
- AOP日志框架实现
		
AOP日志框架实现 JDK动态代理实现日志框架 首先,在项目包com.ay.test 下创建业务接口类BusinessClassService,具体代码如下: BusinessC lassServic ...
 - Spring AOP 源码分析 - 拦截器链的执行过程
		
1.简介 本篇文章是 AOP 源码分析系列文章的最后一篇文章,在前面的两篇文章中,我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程.现在我们的得 ...
 - Spring AOP深入理解之拦截器调用
		
Spring AOP深入理解之拦截器调用 Spring AOP代理对象生成回想 上一篇博客中:深入理解Spring AOP之二代理对象生成介绍了Spring代理对象是怎样生成的,当中重点介绍了JDK动 ...
 - 针对shiro框架authc拦截器认证成功后跳转到根目录,而非指定路径问题
		
一.针对shiro框架authc拦截器认证成功后跳转到根目录,而非指定路径问题 首先,我们先来了解一下authc登录拦截器工作原理 authc拦截器有2个作用: 1>登录认证 请求进来时 ...
 - 基于SSH2框架Struts2拦截器的登录验证实现(转)
		
大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了.那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证. 修改数 ...
 - Spring的AOP,Struts2的拦截器(Interceptor),以及springMVC的(interceptor)
		
参考外链:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilter/ 1.首先,spring的AOP作用范围很广,可以使用Aspec ...
 - .net core 3.1 过滤器(Filter) 与中间件与AOP面向切面 与拦截器及其应用
		
Filter(过滤器) 总共有五种,Authorization Filter,Resource Filter,Exception Filter,Action Filter,Result Filter ...
 - SpringMVC框架05——拦截器
		
1.拦截器概述 Spring MVC的拦截器(Interceptor)与Java Servlet的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证.记录请求信息的 ...
 - 微信小程序 wepy框架 之拦截器intercepter使用
		
1,在使用wepy框架创建的项目下 找到src/app.wpy 2,在app.wpy constructor方法中添加 super(); this.use('promisify');//启用ES6 p ...
 
随机推荐
- python之路 django基础
			
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
 - ACM-ICPC 2018 沈阳赛区网络预赛  J. Ka Chang (树分块)
			
题意:一个树,支持两种操作:1.将深度为L的节点权置加上X;2.求以x为根节点的子树上节点权置之和.根节点深度为0. 分析:考虑用树状数组维护节点权置,按dfs序下标查询.记录每个深度节点的个数.如果 ...
 - java中hashSet原理
			
转自: http://blog.csdn.net/guoweimelon/article/details/50804799 HashSet是JavaMap类型的集合类中最常使用的,本文基于Java1. ...
 - 【转载】redis优化
			
原文链接 批量操作优化: 在使用redis的时候,客户端通过socket向redis服务端发起请求后,等待服务端的返回结果. 客户端请求服务器一次就发送一个报文 -> 等待服务端的返回 -> ...
 - 20145307第七周JAVA学习报告
			
20145307<Java程序设计>第七周学习总结 教材学习内容总结 Lambda Lambda语法概述: Arrays的sort()方法可以用来排序,在使用sort()时,需要操作jav ...
 - 20145335郝昊《java程序设计》第9周学习总结
			
20145335郝昊 <Java程序设计>第9周学习总结 教材学习内容总结 第16章 JDBC(Java DataBase Connectivity)即java数据库连接,是一种用于执行S ...
 - SQL调优简介及调优方式
			
引导语:我曾有一种感觉,不管何种调优方式,索引是最根本的方法,是一切优化手法的内功,所以一下我们 将讨论一些和索引相关的调优方式.索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多 ...
 - python-运算、分支、深浅拷贝
			
算术表达式: + - * / 除法Python3中是默认向浮点数靠拢 //取整运算 结果的最小整数靠拢 向下 5 // 2 = 2(向下取整) %取余运算 5 % 2 = 1 **幂值运算 ...
 - Flask-最简单的Python http服务框架使用
			
环境准备 Python + pip + Flask sudo easy_install pip sudo pip install flask 代码如下(做了个jieba分词的服务) # encodin ...
 - 解题报告:hdu1248寒冰王座 - 完全背包模板
			
2017-09-03 16:16:38 writer:pprp 完全背包问题:从左向右进行扫描,用一维阵列进行分析 代码如下: /* @theme:hdu1248 寒冰王座 @writer:pprp ...