Spring AOP 本质(4)

这一主要看看Spring AOP是如何实现通知包围的。

Spring AOP包围通知在功能上和前置通知加后置通知类似,但还是有区别的:包围通知可以修改返回值,还可以阻止、替换目标方法的执行。

Spring里的包围通知是实现MethodInterceptor接口的拦截器。

Spring包围通知有着很广泛的应用,比如远程代理和事务管理,都是由拦截器完成。另外,拦截器也是剖析程序运行的好方法。

下面利用Spring AOP包围通知实现监控业务方法的执行运行过程耗时情况。

/** 
* 业务组件 
*/ 
public class WorkerBean {

public void doSomeWork(int noOfTimes) { 
        for(int x = 0; x < noOfTimes; x++) { 
            work(); 
        } 
    } 
     
    private void work() { 
        System.out.print(""); 
    } 
}

import java.lang.reflect.Method;

import org.aopalliance.intercept.MethodInterceptor; 
import org.aopalliance.intercept.MethodInvocation; 
import org.springframework.util.StopWatch;

/** 
* 拦截器,实现方法包围通知 
*/ 
public class ProfilingInterceptor implements MethodInterceptor {

public Object invoke(MethodInvocation invocation) throws Throwable { 
        //启动一个 stop watch 
        StopWatch sw = new StopWatch(); 
        //运行计时器 
        sw.start(invocation.getMethod().getName()); 
        //执行业务方法 
        Object returnValue = invocation.proceed(); 
        //停止计时器 
        sw.stop(); 
        //垃圾信息输出 
        dumpInfo(invocation, sw.getTotalTimeMillis()); 
        //返回业务方法返回值 
        return returnValue; 
    }

/** 
     * 垃圾信息输入方法,实际上输出的是方法运行的计时信息 
     */ 
    private void dumpInfo(MethodInvocation invocation, long ms) { 
        //获取被调用方法 
        Method m = invocation.getMethod(); 
        //获取被调用方法所属的对象 
        Object target = invocation.getThis(); 
        //获取被调用方法的参数 
        Object[] args = invocation.getArguments();

System.out.println("所执行的方法: " + m.getName()); 
        System.out.println("对象的类型: " + target.getClass().getName());

System.out.println("方法的参数:"); 
        for (int x = 0; x < args.length; x++) { 
            System.out.print("    > " + args[x]); 
        } 
        System.out.print("\n");

System.out.println("抓取方法运行的时间: " + ms + " ms"); 
    } 
}

import org.springframework.aop.framework.ProxyFactory;

/** 
* 客户端测试方法 
*/ 
public class ProfilingExample {

public static void main(String[] args) { 
        //创建代理对象 
        WorkerBean bean = getWorkerBean(); 
        //在代理对象上调用业务方法 
        bean.doSomeWork(10000000); 
    }

/** 
     * 代理对象工厂 
     */ 
    private static WorkerBean getWorkerBean() { 
        //创建目标对象 
        WorkerBean target = new WorkerBean(); 
        //构建代理对象工厂 
        ProxyFactory factory = new ProxyFactory(); 
        factory.setTarget(target); 
        factory.addAdvice(new ProfilingInterceptor());

//生产一个代理对象 
        return (WorkerBean)factory.getProxy(); 
    } 
}

运行结果:

- Using JDK 1.4 collections 
所执行的方法: doSomeWork 
对象的类型: com.apress.prospring.ch6.profiling.WorkerBean 
方法的参数: 
    > 10000000 
抓取方法运行的时间: 3453 ms

Process finished with exit code 0

从输出的结果中,可以看到程序方法调用的方法名、参数、所属类,以及执行方法所耗费的时间。

另外说一下org.springframework.util.StopWatch类,这是个计时器类,此工具类主要可以获取计时器类start()和stop()两次方法调用间的时间。具体可以查看Spring的API文档。另外,我也在apache commons 包里面也有org.apache.common.lang.time.StopWatch。

http://lavasoft.blog.51cto.com/62575/75342/

时间: 2024-08-25 02:41:42

Spring AOP 本质(4)的相关文章

Spring AOP的本质

不用再百科什么AOP了,我先推荐几篇文章或者系列文章:(感谢这些博文的原作者) 0.  Spring AOP 详解   http://pandonix.iteye.com/blog/336873/ 1.  AOP技术基础系列     http://wayfarer.cnblogs.com/articles/241024.html 2.  我对AOP的理解 http://jinnianshilongnian.iteye.com/blog/1474325 3.  Spring AOP本质系列  ht

JavaEE学习之Spring aop

一.基本概念 AOP——Aspect-Oriented Programming,面向切面编程,它是spring框架的一个重要组成部分.一般的业务逻辑都有先后关系,我们可以理解为纵向关系,而AOP关注的是横向关系,每一个关注点可以理解为一个横切面.例如我们的大部分代码都会涉及到日志记录,很多的数据库操作都会涉及到事务的创建和提交.那么从横向关注这些逻辑,他们都一个个的切面. AOP技术的具体实现,可以通过动态代理技术或者是在程序编译期间进行静态的"织入"方式.AOP经常使用的场景包括:日

[转]彻底征服 Spring AOP 之 理论篇

基本知识 其实, 接触了这么久的 AOP, 我感觉, AOP 给人难以理解的一个关键点是它的概念比较多, 而且坑爹的是, 这些概念经过了中文翻译后, 变得面目全非, 相同的一个术语, 在不同的翻译下, 含义总有着各种莫名其妙的差别. 鉴于此, 我在本章的开头, 着重为为大家介绍一个 Spring AOP 的各项术语的基本含义. 为了术语传达的准确性, 我在接下来的叙述中, 能使用英文术语的地方, 尽量使用英文. 什么是 AOP AOP(Aspect-Oriented Programming),

死磕Spring AOP系列4:剖析AOP schema方式原理

这个是<死磕Spring AOP系列>第4个.已经讲过的内容 死磕Spring AOP系列3:剖析Bean处理器之DefaultAdvisorAutoProxyCreator 死磕Spring AOP系列2:剖析Bean处理器之BeanNameAutoProxyCreator 死磕Spring AOP系列1:编程式实现AOP 通过前3篇,大家应该可以清楚的知道:AOP代理原理有3元素 BeanPostProcessor,作为代理对象初始入口 Advisor&Pointcut&M

Spring AOP面向切面编程

出处:http://yangfei520.blog.51cto.com/1041581/1273069 前两天,在给新入职的同事做技术介绍时,讲到spring的AOP.使我又一次认识到,对于AOP,特别是spring AOP的理解,虽然大家都能说上来几句,但是许多人认识并不太全面,甚至可以说是一知半解----即使是对于那些已经有过几年开发经验的工程师也是如此.所以,回来之后,我干脆对这块东西做了个肤浅的小结,以便再有类似任务时,直接拿来给大家借鉴. AOP(Aspect-Oriented Pro

[Java]Spring AOP基础知识-动态代理

Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的动态代理:另一种是基于CGLib的动态代理.之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的代理,而不支持类的代理. 带有横切逻辑的实例 我们通过具体化代码实现上一节所介绍例子的性能监视横切逻辑,并通过动态代理技术对此进行改造.在调用每一个目标类方法时启动方法的性能监视,在目标类方法调

死磕Spring AOP系列3:剖析Bean处理器之DefaultAdvisorAutoProxyCreator

导航 死磕Spring AOP系列1:编程式实现AOP 死磕Spring AOP系列2:剖析Bean处理器之BeanNameAutoProxyCreator 这是<死磕Spring AOP系列>的第三篇.经过前面的讲解,已经掌握了以下知识点 Spring AOP的底层支持,是基于ProxyFactory+ProxyConfig+Advisor生成的 Spring容器的代理对象生成:在Bean生命周期过长中调用BeanPostProcessor,将对象进行包装,生成代理对象. Advisor的指

Spring AOP整理

示例展示 AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充.AOP之所以能得到广泛认可,主要是因为它将应用系统拆分分了2个部分:核心业务逻辑及横向的通用逻辑,也就是所谓的切面.例如,所有大中型应用都要涉及到的持久化管理.事务管理.权限管理.日志管理和调试管理等.使用AOP技术,可以让开发人员只专注核心业务,而通用逻辑则使用AOP技术进行横向切入,由专人去处理这些通用逻辑,会使得任务简单明了,提高开发和调试的效率.

Java动态代理--&gt;Spring AOP

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123293 [3] 属性