【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起来。

切记项目的版本号要统一,避免没必要的坑!

时间: 2024-08-10 01:23:19

【Spring】利用AOP来做系统性能监控的相关文章

Spring+SpringMVC+Mybatis 利用AOP自定义注解实现可配置日志快照记录

目的: 需要对一些事物的操作进行日志记录,如果在service内进行记录,大量的代码重复,并且维护比较麻烦.所以采用AOP的方式对service进行拦截.使用自定义注解的目的则是判断是否需要记录日志和传递额外的信息. 方式 本次解决方案十分感谢博主-跳刀的兔子的博文 本文绝大部分参考与本文,略有不同,所以做一些整理,博主的文章更详细一些. 1.首先新建自定义注解 @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @

Spring中AOP主要用来做什么。Spring注入bean的方式。什么是IOC,什么是依赖注入

Spring中主要用到的设计模式有工厂模式和代理模式. IOC:Inversion of Control控制反转,也叫依赖注入,通过 sessionfactory 去注入实例:IOC就是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是通过容器生成,同时,要是产生的是单例的bean,他还可以给管理bean的生命周期:通过注解配置或者进行xml配置实现,如@Controller,@Service,@Repository等注解配置 AOP:提供了事务管理的能力.AOP面向切

spring、AOP、IOC

对spring的理解是什么? spring: 1.开源框架: 2.IOC(控制反转),将类的创建和依赖关系写在配置文件里,由配置文件注入,实现了松耦合: 3.AOP将安全.事务等于程序逻辑相对独立的功能抽取出来,利用spring的配置文件将这些功能插进去,实现了按照方面编程,提高了复用性. spring是一个轻型容器,其核心是bean工厂,用以构造我们所需要的Model.在此基础之上,spring提供了aop的实现,用他来提供非管理环境下申明方式的事务.安全等服务:对bean工厂的扩张appli

Spring之AOP原理_动态代理

面向方面编程(Aspect Oriented Programming,简称AOP)是一种声明式编程(Declarative Programming).声明式编程是和命令式编程(Imperative Programming)相对的概念.我们平时使用的编程语言,比如C++.Java.Ruby.Python等,都属命令式编程.命令式编程的意思是,程序员需要一步步写清楚程序需要如何做什么(How to do What).声明式编程的意思是,程序员不需要一步步告诉程序如何做,只需要告诉程序在哪些地方做什么

spring的AOP

最近公司项目中需要添加一个日志记录功能,就是可以清楚的看到谁在什么时间做了什么事情,因为项目已经运行很长时间,这个最初没有开来进来,所以就用spring的面向切面编程来实现这个功能.在做的时候对spring的AOP还比较陌生,事后通过网上学习对其有了较好的了解. AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象

spring(4)面向切面的Spring(AOP)

[0]README 1)本文部分文字描述转自:"Spring In Action(中/英文版)",旨在review  "spring(4)面向切面的Spring(AOP)" 的相关知识: 2)在软件开发中,散布于应用中多处的功能被称为横切关注点.通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往会直接嵌入到应用的业务逻辑中).把这些横切关注点与业务逻辑相分离正是面向切面编程(AOP)所要解决的问题:(干货--引入横切关注点及其所要解决的问题) 3)

菜鸟学SSH(十四)——Spring容器AOP的实现原理——动态代理

之前写了一篇关于IOC的博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP. IOC负责将对象动态的注入到容器,从而达到一种需要谁就注入谁,什么时候需要就什么时候注入的效果,可谓是招之则来,挥之则去.想想都觉得爽,如果现实生活中也有这本事那就爽歪歪了,至于有多爽,各位自己脑补吧:而AOP呢,它实现的就是容器的另一大好处了,就是可以让容器中的对象都享有容器中的公共服务.那么容器是怎么做到的呢?它怎么就能让在它里面的对象自动拥有它

利用AOP实现空模式的无缝使用 创世纪代码应用之一:一行代码让接口框架RUN起来

这是我开播第一篇,朋友们多多支持.捧场,谢谢. 引子 地是空虚混沌.渊面黑暗. 神的灵运行在水面上.  神说.要有光.就有了光.  神看光是好的.就把光暗分开了.  神称光为昼.称暗为夜.有晚上.有早晨.这是头一日. ——引至<圣经.神创造天地> 关键词:null,AOP,Spring.Net框架,空模式,面向接口编程,单元测试,方法拦截器 摘要:在我们编程的时候很难离开null,它给我们带来了很多麻烦.本文从新的视角利用AOP无缝使用空模式部分解决了这个问题,最重要的是可以使得我们的程序尽早

spring ioc aop 原理

spring ioc aop 原理 spring ioc aop 的原理 spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分. 在传统的程序设计中,当调用者需要被调用者的协助时,通常由调用者来创建被调用者的实例.但在spring里创建被调用者的工作不再由调用者来完成,因此控制反转(IoC):创建被调用者实例的工作通常由spring容器来完成,然后注入调用者,因此也被称为依赖注入(DI),依赖注入和控制反转是同一个概念. 面向方面编程(AOP)是以另