1、首先是配置文件:

上图是让aop配置正确,不报红;

完整代码:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5.  
  6. xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:cache="http://www.springframework.org/schema/cache"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context-4.0.xsd
  11. http://www.springframework.org/schema/mvc
  12. http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
  13. http://www.springframework.org/schema/aop
  14. http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
  15. http://www.springframework.org/schema/cache
  16. http://www.springframework.org/schema/cache/spring-cache.xsd">
  17.  
  18. <description>Spring MVC Configuration</description>
  19.  
  20. <!-- 启用spring mvc 注解 -->
  21. <context:annotation-config/>
  22.  
  23. <!-- 设置使用注解的类所在的jar包 -->
  24. <context:component-scan base-package="com.credi****mony.adapter"></context:component-scan>
  25.  
  26. <!-- 完成请求和注解POJO的映射 -->
  27. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
  28.  
  29. <!-- 加载配置属性文件 -->
  30. <context:property-placeholder ignore-unresolvable="true" location="classpath*:/application.properties"/>
  31. <context:property-placeholder location="classpath:log4j.properties"/>
  32. <!-- UTF8解决乱码问题 -->
  33. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
  34. <property name="messageConverters">
  35. <list>
  36. <bean class="org.springframework.http.converter.StringHttpMessageConverter">
  37. <property name="supportedMediaTypes">
  38. <list>
  39. <value>text/html;charset=UTF-8</value>
  40. </list>
  41. </property>
  42. </bean>
  43. </list>
  44. </property>
  45. </bean>
  46.  
  47. <mvc:annotation-driven/>
  48. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
  49. <property name="messageConverters">
  50. <list>
  51. <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
  52. </list>
  53. </property>
  54. </bean>
  55. <!-- 定义视图文件解析 -->
  56. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  57. <property name="prefix" value="${web.view.prefix}"/>
  58. <property name="suffix" value="${web.view.suffix}"/>
  59. </bean>
  60.  
  61. <!-- 对静态资源文件的访问, 将无法mapping到Controller的path交给default servlet handler处理 -->
  62. <mvc:default-servlet-handler/>
  63.  
  64. <!-- 静态资源映射 -->
  65. <mvc:resources mapping="/static/**" location="/static/" cache-period="31536000"/>
  66.  
  67. <!-- 定义无Controller的path<->view直接映射 -->
  68. <mvc:view-controller path="/" view-name="redirect:${web.view.index}"/>
  69.  
  70. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  71. <property name="exceptionMappings">
  72. <props>
  73. <prop key="org.apache.shiro.authz.UnauthorizedException">error/403</prop>
  74. <prop key="java.lang.Throwable">error/500</prop>
  75. </props>
  76. </property>
  77. </bean>
  78.  
  79. <!-- 开启自动切面代理 -->
  80. <aop:aspectj-autoproxy/>
  81. </beans>

  2、对应的class文件,exection里的表达式要正确:

  1. package com.creditharmony.adapter.service.baffle;
  2.  
  3. import com.creditharmony.common.util.DateUtils;
  4. import org.apache.ibatis.binding.MapperMethod;
  5. import org.apache.log4j.Logger;
  6. import org.aspectj.lang.JoinPoint;
  7. import org.aspectj.lang.ProceedingJoinPoint;
  8. import org.aspectj.lang.annotation.*;
  9. import org.aspectj.lang.reflect.MethodSignature;
  10. import org.springframework.stereotype.Component;
  11.  
  12. import java.util.Date;
  13.  
  14. @Aspect
  15. @Component
  16. public class InterceptorBaffle {
  17. private static final Logger logger = Logger.getLogger(InterceptorBaffle.class);
  18.  
  19. // 一分钟,即60000ms
  20. private static final long ONE_MINUTE = 60000;
  21.  
  22. // service层的统计耗时切面,类型必须为final String类型的,注解里要使用的变量只能是静态常量类型的
  23. public static final String POINT = "execution (* com.cred####ony.adapter.service..*.*(..))";
  24.  
  25. /**
  26. * 进入方法后打印日志
  27. * @param joinPoint
  28. */
  29. @Before(POINT)
  30. public void before(JoinPoint joinPoint) {
  31. logger.debug(this.getMethodName(joinPoint)+" start "+ DateUtils.formatDateTime(new Date()));
  32. }
  33.  
  34. /**
  35. * 方法结束打印日志
  36. * @param joinPoint
  37. */
  38. @After(POINT)
  39. public void after(JoinPoint joinPoint) {
  40. logger.debug(this.getMethodName(joinPoint)+" after"+ DateUtils.formatDateTime(new Date()));
  41. }
  42.  
  43. /**
  44. * 统计方法执行耗时Around环绕通知
  45. * @param joinPoint
  46. * @return
  47. */
  48. @Around(POINT)
  49. public Object timeAround(ProceedingJoinPoint joinPoint) {
  50. // 定义返回对象、得到方法需要的参数
  51. Object obj = null;
  52. Object[] args = joinPoint.getArgs();
  53. long startTime = System.currentTimeMillis();
  54.  
  55. try {
  56. obj = joinPoint.proceed(args);
  57. } catch (Throwable e) {
  58. logger.error("统计某方法执行耗时环绕通知出错", e);
  59. }
  60.  
  61. // 获取执行的方法名
  62. long endTime = System.currentTimeMillis();
  63. MethodSignature signature = (MethodSignature) joinPoint.getSignature();
  64. String methodName = signature.getDeclaringTypeName() + "." + signature.getName();
  65.  
  66. // 打印耗时的信息
  67. this.printExecTime(methodName, startTime, endTime);
  68.  
  69. return obj;
  70. }
  71.  
  72. /**
  73. * 打印方法执行耗时的信息,如果超过了一定的时间,才打印
  74. * @param methodName
  75. * @param startTime
  76. * @param endTime
  77. */
  78. private void printExecTime(String methodName, long startTime, long endTime) {
  79. long diffTime = endTime - startTime;
  80. if (diffTime > ONE_MINUTE) {
  81. logger.warn("-----" + methodName + " 方法执行耗时:" + diffTime + " ms");
  82. }
  83. }
  84.  
  85. /**
  86. * 获取方法名(类的详细包路径)
  87. * @param joinPoint
  88. * @return
  89. */
  90. private String getMethodName(JoinPoint joinPoint){
  91. return joinPoint.getSignature().getDeclaringTypeName() +
  92. "." + joinPoint.getSignature().getName();
  93. }
  94.  
  95. }

  

aop 初探的更多相关文章

  1. Spring入门(9)-AOP初探

    Spring入门(9)-AOP初探 0. 目录 什么是面向切面编程 AOP常见术语 AOP实例 参考资料 1. 什么是面向切面编程 Aspect Oriented Programming(AOP),即 ...

  2. spring源码学习之路---AOP初探(六)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,但当初打算学习 ...

  3. spring.net AOP初探

    AOP是什么? 面向切面编程,在OO中有一个开放关闭原则,及对修改关闭,对扩展开放.AOP可以说是设计模式的集合加强版,使用代理.工厂.策略等等模式,来实现方法的结合.这样说还比较模糊,我们先往下看. ...

  4. Spring AOP 初探

    本文可作为北京尚学堂spring课程的学习笔记 首先谈谈什么是AOP 它能干什么 AOP Aspect Oriented Programming(面向切面的编程) 什么叫面向切面? 就是我们可以动态的 ...

  5. 20181122_C#中AOP初探_装饰器模式的AOP_Remoting实现AOP_Castle实现AOP

    一.   什么是AOP: a)         AOP是面向切面编程; 就像oop一样, 它也是一种编程思想; i.    Oop思想→一切皆对象, 对象交互组成功能, 功能叠加组成模块, 模块叠加组 ...

  6. spring源码学习(一)--AOP初探

    LZ以前一直觉得,学习spring源码,起码要把人家的代码整体上通读一遍,现在想想这是很愚蠢的,spring作为一个应用平台,不是那么好研究透彻的,而且也不太可能有人把spring的源码全部清楚的过上 ...

  7. spring学习(3)

    bean的声明周期 为什么把生命周期当做一个重点? Servlet->servlet生命周期 Servlet生命周期分为三个阶段: 1:初始化阶段,调用init()方法 2:响应客户请求阶段,调 ...

  8. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

    更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...

  9. Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

    本文梯子 本文3.0版本文章 更新 代码已上传Github+Gitee,文末有地址 零.今天完成的绿色部分 一.依赖注入的理解和思考 二.常见的IoC框架有哪些 1.Autofac+原生 2.三种注入 ...

随机推荐

  1. 牛客训练赛25-A-最长区间

    https://www.nowcoder.com/acm/contest/158#question 这题问最长的严格连续递增序列的最长长度是多少? 最开始感觉这道题不可做,因为有1e5个点,还有1e5 ...

  2. 2-Twenty Second Scrum Meeting-20151222

    任务安排 成员 今日完成 明日任务 闫昊 服务器关闭,开发停滞……  …… 唐彬 服务器关闭,开发停滞……  …… 史烨轩  服务器关闭,开发停滞……  …… 余帆   路径保存 路径整合 金哉仁   ...

  3. 数学建模-lingo使用

    1.安装启动,软件下载地址:http://pc.xzstatic.com/2017/06/LINGO14 .zip.此为免安装版,打开后双击Lingo11.exe即可启动软件. 2.示例:某商品单位成 ...

  4. selective search

    1.引言:图像的物体识别主要有两个步骤:定位.分类.在分类的过程中,需要对图像中文物体的区域划分出来.传统的方法是利用滑窗,一个窗口一个窗口得选择,将之与目标进行比较,确定物体的位置. 为了降低搜索空 ...

  5. wuziqi

          五子棋结对人崔保雪的博客连接http://www.cnblogs.com/nuoxiaomi/ 题目简介 我们实现了一个五子棋的软件,该软件由初始化模块.下棋操作模块.人机对战模块.人人对 ...

  6. The Last Reader Response——13-17

    Hi, everybody, nice to meet you, this is probably my best and meet you at a time, in the past a seme ...

  7. [转帖]TMD为你揭秘中国互联网下半场所有秘密

    https://www.iyiou.com/p/35099.html 李安说,<比利.林恩的中场战事>是“一个成长的故事”.中国互联网也行至中场,下半场如何走,成长的方向在哪里,成当下关键 ...

  8. poj 3352 Road Construction(边双连通分量+缩点)

    题目链接:http://poj.org/problem?id=3352 这题和poj 3177 一样,参考http://www.cnblogs.com/frog112111/p/3367039.htm ...

  9. ThreadLocal的使用场景及实现原理

    1. 什么是ThreadLocal? 线程局部变量(通常,ThreadLocal变量是private static修饰的,此时ThreadLocal变量相当于成为了线程内部的全局变量) 2. 使用场景 ...

  10. schema举例二

    schema举例二: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs=& ...