【Spring】利用AOP来做系统性能监控
需求:
假设已经有了一些类,现在想统计每个方法调用花了多长时间,该怎么做?
思路:
我第一个想法就是去每个方法执行前后记录一下当前的时间戳,然后相减统计到日志。
OK,没问题,那么这样做合理吗?
首先,工作量大且全部都是重复劳动;
其次,扩招性极其差;
再次,不优雅,写代码不仅要考虑到完成需求,一定要以最优雅的形式完成。
所以决定采用spring的面向切面编程技术来辅助完成这项功能。
步骤:
一、首先新建一个ApiMonitor.java:
@Aspect
public class ApiMonitor { @Pointcut("execution(* com.spring.service.*.*(..))")
private void pointCutMethod() {
} //声明前置通知
@Before("pointCutMethod()")
public void doBefore() {
System.out.println("前置通知");
} //声明后置通知
@AfterReturning(pointcut = "pointCutMethod()", returning = "result")
public void doAfterReturning(String result) {
System.out.println("后置通知");
System.out.println("---" + result + "---");
} //声明例外通知
@AfterThrowing(pointcut = "pointCutMethod()", throwing = "e")
public void doAfterThrowing(Exception e) {
System.out.println("例外通知");
System.out.println(e.getMessage());
} //声明最终通知
@After("pointCutMethod()")
public void doAfter() {
System.out.println("最终通知");
} //声明环绕通知
@Around("pointCutMethod()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("进入方法---环绕通知");
Object o = pjp.proceed();
System.out.println("退出方法---环绕通知");
return o;
}
}
这段代码是copy的,因为觉得写得很典型。
对于本文的需求,应该采用环绕通知@Around这个注解去完成,只要在pjp.proceed()前后分别调用system.currenttimemillis(),然后相减,就OK了。
另外需要注意的是:excution表达式的语法很容易出错,具体如下

二、在applicationcontext.xml中配置aop相关条目
<bean class"org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
<bean id="aspectBean" class="com.spring.aop.ApiMonitor" />
这样就完成了在spring中的IOC装配。
三、别忘了引入aop的依赖
好吧这个应该放在第一点的,没关系,只要在pom.xml中加入:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
版本根据你项目使用的spring版本而定,不要随便写一个版本,容易出错,我是踩过坑的,因为4.x版本中比3.x版本多了一些类,因此如果是4.x的aop去调3.x的spring可能会发生类找不到的问题,直接导致项目无法run起来。
切记项目的版本号要统一,避免没必要的坑!
【Spring】利用AOP来做系统性能监控的更多相关文章
- 利用CGLib实现动态代理实现Spring的AOP
当我们用Proxy 实现Spring的AOP的时候, 我们的代理类必须实现了委托类的接口才能实现. 而如果代理类没有实现委托类的接口怎么办? 那么我们就可以通过CGLib来实现 package cn. ...
- SpringBoot2.x整合Email并利用AOP做一个项目异常通知功能
因为不知aop能干嘛,因此用aop做个小功能,再结合最近学的springboot-Email做了个系统异常自动邮件通知的功能, 感觉满满的成就感. AOP不懂的可以看上一篇:https://www.c ...
- Spring中AOP主要用来做什么。Spring注入bean的方式。什么是IOC,什么是依赖注入
Spring中主要用到的设计模式有工厂模式和代理模式. IOC:Inversion of Control控制反转,也叫依赖注入,通过 sessionfactory 去注入实例:IOC就是一个生产和管理 ...
- Spring框架AOP学习总结(下)
目录 1. AOP 的概述 2. Spring 基于AspectJ 进行 AOP 的开发入门(XML 的方式): 3.Spring 基于AspectJ 进行 AOP 的开发入门(注解的方式): 4.S ...
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- 利用AOP与ToStringBuilder简化日志记录
刚学spring的时候书上就强调spring的核心就是ioc和aop blablabla...... IOC到处都能看到...AOP么刚开始接触的时候使用在声明式事务上面..当时书上还提到一个用到ao ...
- spring的AOP
最近公司项目中需要添加一个日志记录功能,就是可以清楚的看到谁在什么时间做了什么事情,因为项目已经运行很长时间,这个最初没有开来进来,所以就用spring的面向切面编程来实现这个功能.在做的时候对spr ...
- Spring学习总结(三)——Spring实现AOP的多种方式
AOP(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的横向多模块统一控制的一种技术.AOP是OOP的补充,是Spring框架中的一个 ...
- Spring的AOP与代理
spring 支持两种注入方式: setter/constructor 支持多种配置方式: xml/java5注解/java类配置 支持两种事务管理: 声明性/编程性 实际上上述方式只有一个就能保证系 ...
随机推荐
- informix 查看 当前锁表
select username,sid,waiter,dbsname,tabname,rowidlk,keynum,type from sysmaster:syslocks l, sysmaster: ...
- 用GO语言开发editplus编辑器插件(附源码)
我要开发的插件功能极为简单,就是对用户选中的内容进行base64编码或解密工作. 其中所涉及的技术部分主要是GO语言程序开发和editplus插件配置的部分,首先我们来看一下GO语言代码的写法,如下: ...
- GO語言視頻教程下載
需要的朋友可以加QQ群195112,在群共享內可以下載到.
- cygintl-8.dll 是cygwin的哪个包?|Windows查看man手册的方法-cygwin
答案是: 是 Release\gettext\libintl8\libintl8-0.18.1.1-2.tar.bz2 应该是gettext 项目的一部分吧. 下载地址 可以直接从 cygwin的镜像 ...
- 针对远程Git代码库使用SSH公匙
→ 运行Git Bash→ 创建SSH公匙和私匙ssh-keygen -t rsa→ 输入SSH公匙存放文件,选择使用默认的,按Enter→ 如果已经存在,提示是否重写,输入n,按Enter→ 打开C ...
- MAC电脑操作快捷键
注:command即苹果键,也有人称为花键.ctrl即control键.escape即键盘左上角的esc键.space空格键. 屏幕捕捉快捷键 动作:保存到-快捷键 全屏捕捉-桌面(.pdf文件):c ...
- iOS Vuforia:TextReco 增加自己的单词库
Vuforia的文字识别引擎提供了很好的文字识别功能.引擎依赖于UTF-8字符编码,现支持的字符有A-Z a-z,换行符.空格.单引号.短斜杠.Note:不支持中文及数字.能识别的字体是: ...
- Python 目录操作
知道两个文件的绝对目录,怎样计算出两个文件的相对目录,例如:知道 a = '/usr/share/pyshared/test/a.py' b = '/usr/lib/dist/test/a.py' 可 ...
- Dell U2913WM使用感受
21:9比例,本来想代替双屏的,一周用下来还是不适应,如何能弯成曲面就爽了.感觉最舒服的还是以前19寸5:4双屏,点距大. 还尝试在旁边立个23寸,看了15分钟就受不了,头晕. 漏光,还行. 加了个A ...
- linux 系统性能指标采样脚本
以下脚本写于redmine性能排查时,用于定位系统性能瓶颈的采样,源地址为~/performanceLog/collectLog.sh中,计划放入github的代码片段库中. 注: 如果mysql的地 ...