手把手教你用Java实现AOP
作者:网络转载 发布时间:[ 2015/3/27 14:43:51 ] 推荐标签:Java 软件开发 Spring JDK
现在我们已经知道,InvocationHandler的invoke()方法能够帮助我们解决问题。那么再来解决一个新问题——怎样才能在方法执行的前后执行操作呢?说的更具体一些,我们能通过添加多个aop(before、after、around)来hook一个方法吗(译注:原文为add multiple aops,但我认为Handler是充当Aspect的角色)?答案同样是肯定的。按照以下的步骤建立一个精简的代码模板便能满足这样的需求:
创建一个抽象类,用于将aop应用于目标对象上。
创建名为BeforeHandler 和 AfterHandler的两个aop。前者在方法执行之前工作,而后者则在方法执行结束后工作。
创建一个代理类,使所有的aop handler和目标对象只需作为参数传入,能创建一个hook。
加入你自己的业务逻辑或者横切关注点。
后,通过传入相关的参数创建代理对象(proxy object)。
技术实现概要
(译注:此处是核心代码片段,如果想运行该实例,需进入下方提供的链接下载完整代码)
创建一个handler的抽象类:
public abstract class AbstractHandler implements InvocationHandler {
private Object targetObject;
public void setTargetObject(Object targetObject) {
this.targetObject = targetObject;
}
}
创建名为BeforeHandler和AfterHandler的两个易扩展的handler抽象类:
public abstract class BeforeHandler extends AbstractHandler {
public abstract void handleBefore(Object proxy, Method method, Object[] args);
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
handleBefore(proxy, method, args);
return method.invoke(getTargetObject(), args);
public abstract class AfterHandler extends AbstractHandler {
public abstract void handleAfter(Object proxy, Method method, Object[] args);
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(getTargetObject(), args);
handleAfter(proxy, method, args);
return result;
}
}
创建Proxy的工厂类:
public class ProxyFactory {
public static Object getProxy(Object targetObject,
List handlers) {
//Code to get the proxy
return proxyObject;
} else {
return targetObject;
}
}
}
以下为测试代码:
CalculatorImpl calcImpl = new CalculatorImpl();
BeforeHandler before = new BeforeHandlerImpl();
AfterHandler after = new AfterHandlerImpl();
List<AbstractHandler> handlers = new ArrayList<AbstractHandler>();
handlers.add(before);
handlers.add(after);
Calculator proxy = (Calculator) ProxyFactory.getProxy(calcImpl,
handlers);
int result = proxy.calculate(20, 10);
配置
以上的代码片段简明扼要地解释了AOP在结构上的实现(structural implementation)。当然,如果能通过实际的测试将其运用到现实中去,那再好不过了。读者可在下面的链接中获取完整的工程文件,并在Java编辑器中配置它们,后通过其中的测试类来检验效果。
https://github.com/debjava/aopusingjdkdynamicproxy
总结
希望这篇简短的有关AOP文章能够帮助到大家。需说明的是,本文只实现了before和after两种aop,而另外两种,即“Around”和“Throw”,则希望读者自行完成。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
Java性能测试有哪些不为众人所知的原则?Java设计模式??装饰者模式谈谈Java中遍历Map的几种方法Java Web入门必知你需要理解的Java反射机制知识总结编写更好的Java单元测试的7个技巧编程常用的几种时间戳转换(java .net 数据库)适合Java开发者学习的Python入门教程Java webdriver如何获取浏览器新窗口中的元素?Java重写与重载(区别与用途)Java变量的分类与初始化JavaScript有这几种测试分类Java有哪四个核心技术?给 Java开发者的10个大数据工具和框架Java中几个常用设计模式汇总java生态圈常用技术框架、开源中间件,系统架构及经典案例等

sales@spasvo.com