Java实现AOP面向切面编程的实例教程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java实现AOP面向切面编程的实例教程

这篇文章主要介绍了Java实现AOP面向切面编程的实例教程,通常Java中的AOP都是利用Spring框架中造好的轮子来开发,而本文则关注于Java本身AOP的设计模式实现,需要的朋友可以参考下

介绍

众所周知,AOP(面向切面编程)是Spring框架的特色功能之一。通过设置横切关注点(cross cutting concerns),AOP提供了极高的扩展性。那AOP在Spring中是怎样运作的呢?当你只能使用core java,却需要AOP技术时,这个问题的解答变得极为关键。不仅如此,在高级技术岗位的面试中,此类问题也常作为考题出现。这不,我的朋友最近参加了一个面试,就被问到了这样一个棘手的问题——如何在不使用Spring及相关库,只用core Java的条件下实现AOP。因此,我将在本文中提供一份大纲,帮助大家了解如何只用core Java实现一个AOP(当然啦,这种AOP在功能上有一定的局限性)。注意,本文不是一篇有关Spring AOP 与Java AOP的对比研究,而是有关在core Java中借助固有的设计模式实现AOP的教程。

想必读者已经知道AOP是什么,也知道在Spring框架中如何使用它,因此本文只着眼于如何在不用Spring的前提下实现AOP。首先,我们得知道,Spring是借助了JDK proxy和CGlib 两种技术实现AOP的。JDK dynamic proxy提供了一种灵活的方式来hook一个方法并执行指定的操作,但执行操作时得有一个限制条件:必须先提供一个相关的接口以及该接口的实现类。实践出真知,让我们透过一个案例来理解这句吧!现在有一个计算器程序,用于完成一些数学运算。让我们来考虑下除法功能,此时的问题是:如果core framework已经具备了一份实现除法的代码,我们能否在代码执行时劫持(highjack)它并执行额外的校验呢?答案是肯定的,我将用下面提供的代码片段来证明这点。首先来看基础接口的代码:

public interface Calculator{public int calculate(int a,int b);}

该接口实现类的代码如下:

public class CalculatorImpl implements Calculator{@Override public int calculate(int a,int b) {return a/b;}}

假设我们既不能修该上面的代码,也不能对核心库进行任何改动,怎样才能完美地实现校验功能呢?不如试下JDK dynamic proxy的功能吧。

public class SomeHandler implements InvocationHandler{//Code omitted for simplicity….. @Override public Object invoke(Object proxy,Method method,Object[]params)throws Throwable{//Your complex business validation and logic Object result= method.invoke(targetObject,params);return result;}}

让我们通过测试类来看看由JDK dynamic proxy实现的校验功能的效果如何。

public static void main(String[]args){CalculatorImpl calcImpl=new CalculatorImpl(); Calculator proxied=(Calculator)ProxyFactory.getProxy(Calculator.class,calcImpl,new SomeHandler(calcImpl));int result=calculate(20,10); System.out.println("FInal Result:::"+result);}

从结果可以看出,简单地实现功能强大的InvocationHandler接口,我们便能得到一个hooking implementation。按照JDK文档的描述,InvocationHandler接口是借助一个代理实例(proxy instance)来处理一个方法调用的。

现在我们已经知道,InvocationHandler的invoke()方法能够帮助我们解决问题。那么再来解决一个新问题——怎样才能在方法执行的前后执行操作呢?说的更具体一些,我们能通过添加多个aop(before、after、around)来hook一个方法吗(译注:原文为add multiple aops,但我认为Handler是充当Aspect的角色)?答案同样是肯定的。按照以下的步骤建立一个精简的代码模板便能满足这样的需求:

1.创建一个抽象类,用于将aop应用于目标对象上。

2.创建名为BeforeHandler和AfterHandler的两个aop。前者在方法执行之前工作,而后者则在方法执行结束后工作。

3.创建一个代理类,使所有的aop handler和目标对象只需作为参数传入,就能创建一个hook。

4.加入你自己的业务逻辑或者横切关注点。

5.最后,通过传入相关的参数创建代理对象(proxy object)。

两种实现AOP的方式:

1,JDK提供的动态代理实现

接口

public interface UserBean{void getUser();void addUser();void updateUser();void deleteUser();}

原始实现类

public class UserBeanImpl implements UserBean{private String user=null;public UserBeanImpl(){}public UserBeanImpl(String user){er= user;}public String getUserName(){return user;}public void getUser() {System.out.println("this is getUser()method!");}public void setUser(String user) {er=user;System.out.println("this is setUser()method!");}public void addUser(){System.out.println("this is addUser()method!");}public void updateUser(){System.out.println("this is updateUser()method!");}public void deleteUser(){System.out.println("this is deleteUser()method!");}}

代理类

相关文档
最新文档