用 AOP 来记录每个方法的执行时间(Spring 或直接 AspectJ)
有时候我们要跟踪方法的执行时间,来观察系统的性能、时间分布。特别是要找出那些十分耗时的操作。如果是在每个方法中起始和结束位置记下时间相减,那是不太现实的,对代码的侵入性太过份,而且在产品环境中又得屏闭那部份代码。
幸好现在有了?AOP,通过配置方式再加上外部辅助代码就能达到我们的要求,正式上线时只需要简单改个配置项拆卸下来即可。
下面介绍三种方式来打印每个方法的执行时间,分别是:
1.?Spring?2.0 用?AspectJ?实现 AOP
2. Spring 通用的方法拦截
3. 直接用 AspectJ 实现
1. Spring 2.0 用 AspectJ 实现 AOP
?
这个实例由五个文件构成,两个配置文件和三个类文件。需要在项目中引用 Spring 2.0 以上版本的相关包,还要日志包。
1) log4j.properties? 放在 src 目录下
4) HelloService.java?被拦截的业务类
2. Spring 通用的方法拦截
Spring 1.x 因为不能用 AspectJ 来对方法进行拦截,要用到 ProxyFactoryBean 使用 AOP,具体操作方法只需要更换以上例子中的 applicationContext.xml 文件就行,内容如下:
再就是因为无需用到 Spring 了,不需要 IOC 了,相应的 Main.java 的内容如下:
Main.java?(以前如何创建 HelloService,现在还是怎么做)
package com.unmi;import com.unmi.service.HelloService;/** * 测试主类 * @author Unmi */public class Main {/** * @param args */public static void main(String[] args) {HelloService helloService = new HelloService();helloService.sayHello(1,"Unmi");}}OK,现在就可以在 Eclipse 中开始运行 Main 类了,对 methodTimeAdviceRecipe.aj 的编译工作由插件 AJDT 自动帮你作了(实质是相匹配的类中插入了代码)。运行 Main 的结果如下:
Hello Unmi(1)
2008-01-21 13:48:16,171 [DEBUG] MethodTimeAdvice.sayHello_aroundBody1$advice(130)
Takes: 515 ms [void com.unmi.service.HelloService.sayHello(int, String)(16)]用 AspectJ 可以很灵活的定义方面,局限就是对方面的改变须重新编译相关类,而非配置方式。