快速业务通道

Spring框架的设计理念与设计模式分析 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13
和被代理的类是同一个 Loader 类。Interfaces,是要被代理的那些那些接口。InvocationHandler,就是用于执行除了被代理接口中方法之外的用户自定义的操作,他也是用户需要代理的最终目的。用户调用目标方法都被代理到 InvocationHandler 类中定义的唯一方法 invoke 中。这在后面再详解。

下面还是看看 Proxy 如何产生代理类的过程,他构造出来的代理类到底是什么样子?下面揭晓啦。

图 17. 创建代理对象时序图

Spring框架的设计理念与设计模式分析(13)

时间:2012-02-26 IBM 许令波

其实从上图中可以发现正在构造代理类的是在 ProxyGenerator 的 generateProxyClass 的方法中。ProxyGenerator 类在 sun.misc 包下,感兴趣的话可以看看他的源码。

假如有这样一个接口,如下:

清单 7. SimpleProxy 类

public interface SimpleProxy {    public void simpleMethod1();    public void simpleMethod2(); } 

代理来生成的类结构如下:

清单 8. $Proxy2 类

public class $Proxy2 extends java.lang.reflect.Proxy implements SimpleProxy{    java.lang.reflect.Method m0;    java.lang.reflect.Method m1;    java.lang.reflect.Method m2;    java.lang.reflect.Method m3;    java.lang.reflect.Method m4;    int hashCode();    boolean equals(java.lang.Object);    java.lang.String toString();    void simpleMethod1();    void simpleMethod2(); }

这个类中的方法里面将会是调用 InvocationHandler 的 invoke 方法,而每个方法也将对应一个属性变量,这个属性变量 m 也将传给 invoke 方法中的 Method 参数。整个代理就是这样实现的。

Spring AOP 如何实现

从前面代理的原理我们知道,代理的目的是调用目标方法时我们可以转而执行 InvocationHandler 类的 invoke 方法,所以如何在 InvocationHandler 上做文章就是 Spring 实现 Aop 的关键所在。

Spring 的 Aop 实现是遵守 Aop 联盟的约定。同时 Spring 又扩展了它,增加了如 Pointcut、Advisor 等一些接口使得更加灵活。

下面是 Jdk 动态代理的类图:

图 18. Jdk 动态代理的类图

Spring框架的设计理念与设计模式分析(14)

时间:2012-02-26 IBM 许令波

上图清楚的显示了 Spring 引用了 Aop Alliance 定义的接口。姑且不讨论 Spring 如何扩展 Aop Alliance,先看看 Spring 如何实现代理类的,要实现代理类在 Spring 的配置文件中通常是这样定一个 Bean 的,如下:

清单 9. 配置代理类 Bean

<bean id="testBeanSingleton"    class="org.springframework.aop.framework.ProxyFactoryBean">    <property name="proxyInterfaces">      <value>        org.springframework.aop.framework.PrototypeTargetTests$TestBean      </value>    </property>    <property name="target"><ref local="testBeanTarget"></ref> </property>    <property name="singleton"><value>true</value></property>    <property name="interceptorNames">      <list>        <value>testInterceptor</value>        <value>testInterceptor2</value>      </list>    </property> </bean>

配置上看到要设置被代理的接口,和接口的实现类也就是目标类,以及拦截器也就在执行目标方法之前被调用,这里 Spring 中定义的各种各样的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号