前言

日志是所有系统必不可少的部分,而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,日志框架和拦截器的更多相关文章

  1. AOP日志框架实现

    AOP日志框架实现 JDK动态代理实现日志框架 首先,在项目包com.ay.test 下创建业务接口类BusinessClassService,具体代码如下: BusinessC lassServic ...

  2. Spring AOP 源码分析 - 拦截器链的执行过程

    1.简介 本篇文章是 AOP 源码分析系列文章的最后一篇文章,在前面的两篇文章中,我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程.现在我们的得 ...

  3. Spring AOP深入理解之拦截器调用

    Spring AOP深入理解之拦截器调用 Spring AOP代理对象生成回想 上一篇博客中:深入理解Spring AOP之二代理对象生成介绍了Spring代理对象是怎样生成的,当中重点介绍了JDK动 ...

  4. 针对shiro框架authc拦截器认证成功后跳转到根目录,而非指定路径问题

    一.针对shiro框架authc拦截器认证成功后跳转到根目录,而非指定路径问题 首先,我们先来了解一下authc登录拦截器工作原理 authc拦截器有2个作用: 1>登录认证     请求进来时 ...

  5. 基于SSH2框架Struts2拦截器的登录验证实现(转)

        大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了.那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证.     修改数 ...

  6. Spring的AOP,Struts2的拦截器(Interceptor),以及springMVC的(interceptor)

    参考外链:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilter/ 1.首先,spring的AOP作用范围很广,可以使用Aspec ...

  7. .net core 3.1 过滤器(Filter) 与中间件与AOP面向切面 与拦截器及其应用

    Filter(过滤器) 总共有五种,Authorization Filter,Resource Filter,Exception Filter,Action Filter,Result Filter ...

  8. SpringMVC框架05——拦截器

    1.拦截器概述 Spring MVC的拦截器(Interceptor)与Java Servlet的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证.记录请求信息的 ...

  9. 微信小程序 wepy框架 之拦截器intercepter使用

    1,在使用wepy框架创建的项目下 找到src/app.wpy 2,在app.wpy constructor方法中添加 super(); this.use('promisify');//启用ES6 p ...

随机推荐

  1. google GFS

    我们设计并实现了Google GFS文件系统,一个面向大规模数据密集型应用的.可伸缩的分布式文件系统.GFS虽然运行在廉价的普遍硬件设备上,但是它依然了提供灾难冗余的能力,为大量客户机提供了高性能的服 ...

  2. 安装centos7最小化安装

    分享一篇不错的文章: https://www.howtoforge.com/tutorial/centos-7-server/

  3. Docker storage drivers

    因为Docker的镜像是分层的,包含只读层和可读写层,因此选择正确的Storage Driver对于容器的性能是非常重要的. 支持的Linux发行版本 目前推荐使用性能最好的Overlay2.RHEL ...

  4. CORE MVC 自定义认证

    微软的认证体系,集成了EF,和它的表结构,对于我们已有的系统,或者想高度自定义的人,该怎么办呢? 答案在: https://docs.microsoft.com/en-us/aspnet/core/s ...

  5. js初步用法

    js js引入方式:  1.方式一   通过script标签引入 2.方式二   通过script标签引入 ,src属性 引入一个外部的js文件 注意: 如果你使用了script标签的src属性 那么 ...

  6. LeetCode——remove-duplicates-from-sorted-list-ii

    Question Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only dist ...

  7. 同余定理简单应用 - poj2769 - hdu 1021 - hdu 2035

    同余问题 基本定理: 若a,b,c,d是整数,m是正整数, a = b(mod m), c = d(mod m) a+c = b+c(mod m) ac = bc(mod m) ax+cy = bx+ ...

  8. Vjudge - E - 这是高中数学向量题

    2017-07-15 22:29:06 writer:pprp 评价,用到了叉乘,很麻烦,C++构造知识必须扎实 题目如下: 我们用逆时针方向的顶点序列来表示,我们很想了解这块地的基本情况,现在请你编 ...

  9. Python学习札记(三) I/O

    参考:输入和输出 I/O 1.print()函数 a.调用print()输出字符串有以下两种方式:(1)print('[字符串]') (2)print("[字符串]") b.调用p ...

  10. R中的sub替换函数【转】

    R中的grep.grepl.sub.gsub.regexpr.gregexpr等函数都使用正则表达式的规则进行匹配.默认是egrep的规则,也可以选用Perl语言的规则.在这里,我们以R中的sub函数 ...