这一主要看看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/

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

  1. Spring AOP就是这么简单啦

    前言 只有光头才能变强 上一篇已经讲解了Spring IOC知识点一网打尽!,这篇主要是讲解Spring的AOP模块~ 之前我已经写过一篇关于AOP的文章了,那篇把比较重要的知识点都讲解过了一篇啦:S ...

  2. Spring AOP学习笔记01:AOP概述

    1. AOP概述 软件开发一直在寻求更加高效.更易维护甚至更易扩展的方式.为了提高开发效率,我们对开发使用的语言进行抽象,走过了从汇编时代到现在各种高级语言繁盛之时期:为了便于维护和扩展,我们对某些相 ...

  3. Spring AOP技术本质认识

    Spring AOP技术本质认识 一.AOP简介   AOP(Aspect Oriented Programming,面向切面编程),把某一类问题集中在一个地方进行处理,比如处理程序中的点击事件.打印 ...

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

    基本知识 其实, 接触了这么久的 AOP, 我感觉, AOP 给人难以理解的一个关键点是它的概念比较多, 而且坑爹的是, 这些概念经过了中文翻译后, 变得面目全非, 相同的一个术语, 在不同的翻译下, ...

  5. Spring AOP中定义切点(PointCut)和通知(Advice)

    如果你还不熟悉AOP,请先看AOP基本原理,本文的例子也沿用了AOP基本原理中的例子.切点表达式 切点的功能是指出切面的通知应该从哪里织入应用的执行流.切面只能织入公共方法.在Spring AOP中, ...

  6. Spring AOP整理

    示例展示 AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充.AOP之所以能得到广泛认可,主要是因为它将应用系统拆分分了 ...

  7. Spring Aop 应用实例与设计浅析

    0.代码概述 代码说明:第一章中的代码为了突出模块化拆分的必要性,所以db采用了真实操作.下面代码中dao层使用了打印日志模拟插入db的方法,方便所有人运行demo. 1.项目代码地址:https:/ ...

  8. JavaEE学习之Spring AOP

    一.基本概念 AOP——Aspect-Oriented Programming,面向切面编程,它是spring框架的一个重要组成部分.一般的业务逻辑都有先后关系,我们可以理解为纵向关系,而AOP关注的 ...

  9. Spring AOP的实现研究

    1. 背景 在前文Spring IOC容器创建bean过程浅析已经介绍了Spring IOC创建初始化bean的大致过程.现在对Spring的AOP实现机制进行研究分析. 2. 名词与概念 名词 概念 ...

随机推荐

  1. windows系统各版本 各种数据结构

    极爽啊http://msdn.moonsols.com/

  2. 【转】NPAPI 插件无法在 Chrome 42 版及更高版本上正常运行

    原文网址:https://support.google.com/chrome/answer/6213033 NPAPI 插件无法在 Chrome 42 版及更高版本上正常运行 您可以利用插件在浏览器中 ...

  3. 动态规划——min/max的单调性优化总结

    一般形式: $max\{min(ax+by+c,dF(x)+eG(y)+f)\},其中F(x)和G(y)是单调函数.$ 或 $min\{max(ax+by+c,dF(x)+eG(y)+f)\},其中F ...

  4. Oracle索引状态查询&索引重建

    --检查损坏索引 SELECT status, COUNT(*)   FROM dba_indexes  GROUP BY status UNION SELECT status, COUNT(*)   ...

  5. Linux 内存管理知识学习总结

    现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的.对于内存部分需要知道: 地址映射 内存管理的方式 缺页异常 先来看一些基本的知识,在进程看来,内 ...

  6. 深入理解linux网络技术内幕读书笔记(二)--关键数据结构

    Table of Contents 1 套接字缓冲区: sk_buff结构 1.1 网络选项及内核结构 1.2 结构说明及操作函数 2 net_device结构 2.1 MTU 2.2 结构说明及操作 ...

  7. 万恶DevExpress

    公司需要,开始了DevExpress的学习之旅,说它万恶也只是在不了解它的情况下,熟悉之后能很方便的实现很多想要的功能 这里简单写一下要整理的内容,也就是大纲,以后再慢慢添加 一.控件和组件 date ...

  8. UVA 1558 - Number Game(博弈dp)

    UVA 1558 - Number Game 题目链接 题意:20之内的数字,每次能够选一个数字,然后它的倍数,还有其它已选数的倍数组合的数都不能再选,谁先不能选数谁就输了,问赢的方法 思路:利用dp ...

  9. python - 类的特殊成员

    class Foo: #构造方法 def __init__(self,name,age): pass self.name = name self.age = age def __str__(self) ...

  10. c#、sql数据库备份还原

    1.在项目中添加SQLDmo dll文件引用(SQLDMO(SQL Distributed Management Objects,SQL分布式管理对象)) 2在相应页面加using SQLDMO引用 ...