spring aop实现打印方法执行时间
来源:互联网 发布:太原市九鼎软件 编辑:程序博客网 时间:2024/06/05 18:02
spring aop基于代理实现,主要包含两种----接口代理,类代理
接口代理 可参考jdk代理,主要通过反射来实现
类代理 可参考cglib代理,主要使用继承来实现
注:两种代理均无法实现对私有方法和静态方法的代理
这两种代理都可以看做代理设计模式的一种实现.
前一段时间要统计一个项目中各个方法的执行时间,就用spring aop做了一个实现,以下是相关代码
1.添加包依赖 注:aspectj版本过低会导致无法识别execution表达式
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version></dependency><dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.10</version></dependency><dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.9</version></dependency><dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>1.8.9</version></dependency>
2.配置文件
<aop:aspectj-autoproxyproxy-target-class="true"/>
proxy-target-class强制类代理,可以避免无接口类的代理失败
因为我还要统计Controller层的方法,所以此处强制使用类代理
3.代码import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;import java.util.HashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;/** * @Author MissNull * @Description: * @Date: Created in 2017/8/14. */@Aspect@Componentpublic class PrintTime { private Map<Long, Map<String, List<Long>>> threadMap = new ConcurrentHashMap<>(200); @Pointcut(value = "execution(* com.ai.shop.controller..*.*(..))") public void controller() { } @Pointcut(value = "execution(* com.ai.shop.dao.impl.*.*(..))") public void dao() { } @Pointcut(value = "execution(* com.ai.shop.services.impl.*.*(..))") public void service() { } @Before(value = "controller() || dao() || service()") public void before(JoinPoint joinPoint) { System.out.println(joinPoint.toShortString() + " 开始"); Map<String, List<Long>> methodTimeMap = threadMap.get(Thread.currentThread().getId()); List<Long> list; if (methodTimeMap == null) { methodTimeMap = new HashMap<>(); list = new LinkedList<>(); list.add(System.currentTimeMillis()); methodTimeMap.put(joinPoint.toShortString(), list); threadMap.put(Thread.currentThread().getId(), methodTimeMap); } else { list = methodTimeMap.get(joinPoint.toShortString()); if (list == null) list = new LinkedList<>(); list.add(System.currentTimeMillis()); methodTimeMap.put(joinPoint.toShortString(), list); } } @After(value = "controller() || dao() || service()") public void after(JoinPoint joinPoint) { System.out.println(joinPoint.toShortString() + " 结束"); Map<String, List<Long>> methodTimeMap = threadMap.get(Thread.currentThread().getId()); List<Long> list = methodTimeMap.get(joinPoint.toShortString()); System.out.println("耗时:" + (System.currentTimeMillis() - list.get(list.size() - 1))); list.remove(list.size() - 1); }}
4.也可以在配置文件中声明,不用注解
<aop:config> <aop:pointcut id="allMethod" expression="execution(* com.ai.*.*.*.*(..))"/> <aop:aspect ref="printTime"> <aop:before method="before" pointcut-ref="allMethod"/> <aop:after method="after" pointcut-ref="allMethod"/> </aop:aspect></aop:config>
阅读全文
0 0
- spring aop实现打印方法执行时间
- spring aop 实现方法执行时间监控
- spring aop 实现方法执行时间监控
- 使用Spring的AOP实现接口方法执行时间记录
- Spring AOP - 注解实现统计service中方法的执行时间
- Spring AOP实践--记录类方法执行时间
- spring boot aop 记录方法执行时间
- AspectJ spring aop 记录某些类中方法执行时间实例
- AspectJ spring aop 记录某些类中方法执行时间实例
- 使用Spring AOP来统计方法的执行时间
- 使用Spring AOP来统计方法的执行时间
- 使用Spring AOP来统计方法的执行时间
- 用Spring AOP实现异常处理和记录程序执行时间
- Spring AOP实现统一日志打印框架
- spring AOP的实现方法
- Spring aop拦截springmvc的controller请求方法,添加日志和统计方法执行时间
- 一个用Spring AOP实现异常处理和记录程序执行时间的实例--邵京国
- 5.11 一个用Spring AOP实现异常处理和记录程序执行时间的实例
- JavaScript冒泡排序(冒泡排序最优版)包括如果原数组已经排好顺序,不需要在比较,直接终止循环!
- Linux 屏幕亮度调节
- Console类的输入与输出学习
- HDU 6128 Inverse of sum(数学)
- 什么是多态,多态的概念,多态的体现,多态的应用
- spring aop实现打印方法执行时间
- 购物车
- 智能小车十六《openwrt虚拟机连接网络》
- bootstrap3-dialog-master模态框
- selenium2.0关于python的常用函数
- PRU-ICSS EtherCAT slave package
- RxJava2.0中just操作符用法和源码分析(二)
- 206。Reverse Linked List
- 重定向和转发