分享

Spring框架中的AOP思想动态代理模式

 软件团队头目 2008-01-17
一 AOP(Aspect oriented programming) 面向方面编程
OOP面向对象编程
AOP和OOP虽然在字面上十分相似,但却是面向不同领域的两种设计思想.OOP是在面向过程的编程方法基础上进行的改进,而AOP面向方面编程又是在面向对象编程的基础上进行改进而来的一种新的软件开发方法.OOP针对问题领域中存在的实体及其属性和操作进行抽象和封装,而AOP则是针对业务处理过程中的切面进行提取.
例如: 某一操作在各个模块中都有涉及,就可把这个操作"横切"存在于系统当中,这些操作大都不属于逻辑操作的部分,AOP就是将这些操作与业务逻辑分离,AOP所面对的是处理过程中的某个步骤或阶段.
              AOP的核心思想:
    就是将应用程序中的业务逻辑处理部分同对其提供的通用服务部分即"横切关注点"进行分离.
 
二 Sping框架的特点 AOP的应用
Spring框架目前如此流行,大概一方面是Spring提供了一套全面并且十分成熟的轻型应用程序基础框架,对复杂的应用开发提供了帮助,另一方面,实际开发中Spring最大的优势在于它是从实际项目开发经验中抽取的,并提供了丰富的类库,可大大节省编码量,不过Spring框架中最吸引人的也是该应用框架最具特色的地方就是IoC控制反转或者DI依赖注入.比如说 不用你主动来找我,我会通知你的
 
但是Spring最成功的地方还是AOP的应用.
Spring应用程序框架将AOP思想融入了整个框架的设计和开发与应用中,实际上是一种设计式的扩展.其内置AOP默认是使用动态代理模式实现,即在代码中不出现与具体要用到的接口或者类的引用. 即动态代理的核心技术
 
三 Spring动态代理机制的实现
通过动态Proxy模式,在目标对象的方法调用前后插入相应的处理代码,任何的接口都能被代理,也符合”面向接口编程”的良好风格.
Spring实现原理,其内置的AOP默认使用动态代理模式实现,即在代码中不出现与具体应用相关的接口或者类引用.即这个代理类适用于任何接口的实现
例:
public class MyInvocationHandler implements InvocationHandler
{
       private Object originalObject;
       public Object bind(Object obj)
       {
              this.orginalObject = obj;
              return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
       }
      
       public Object invoke(Object proxy,Method method,Object [] args)throws Throwable
       {
              Object result = null;
              result = method.invoke(originalObject,args);
              return result;
       }
}
分析一下上述代码的关键
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
java.lang.reflect.Proxy.newProxyInstance方法根据传入的接口类型obj.getClass().getInterfaces()动态构造出一个代理实例返回,这也说明为什么动态代理实现要求其所代理的对象一定要至少实现一个接口.因这个代理类实例是在运行时从内存中动态构造出的它实现了传入的所有接口.
 
public Object invoke(Object proxy,Method method,Object [] args) throws Throwable
{
       …
       result = method.invoke(originalObject,args)
}    
       InvocationHandler.invoke方法将在代理类的方法将在代理类的方法被调用之前触发.通过这个方法,我们可以在被代理类方法调用的前后进行一些处理,在上述方法中,InvocationHandler.invoke方法的参数中传递了当前被调用的方法Method,被调用方法的参数args,通过method.invoke方法调用被代理类的原始方法实现.这样就可以在被代理类的方法调用前后写入任何想要进行的操作.
 


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1201828

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多