快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13
拦截器,可以选择使用。

下面看看 Spring 如何完成了代理以及是如何调用拦截器的。

前面提到 Spring Aop 也是实现其自身的扩展点来完成这个特性的,从这个代理类可以看出它正是继承了 FactoryBean 的 ProxyFactoryBean,FactoryBean 之所以特别就在它可以让你自定义对象的创建方法。当然代理对象要通过 Proxy 类来动态生成。

下面是 Spring 创建的代理对象的时序图:

图 19.Spring 代理对象的产生

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

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

Spring 创建了代理对象后,当你调用目标对象上的方法时,将都会被代理到 InvocationHandler 类的 invoke 方法中执行,这在前面已经解释。在这里 JdkDynamicAopProxy 类实现了 InvocationHandler 接口。

下面再看看 Spring 是如何调用拦截器的,下面是这个过程的时序图:

图 20.Spring 调用拦截器

以上所说的都是 Jdk 动态代理,Spring 还支持一种 CGLIB 类代理,感兴趣自己看吧。

Spring 中设计模式分析

Spring 中使用的设计模式也很多,比如工厂模式、单例模式、模版模式等,在《 Webx 框架的系统架构与设计模式》、《 Tomcat 的系统架构与模式设计分析》已经有介绍,这里就不赘述了。这里主要介绍代理模式和策略模式。

代理模式

代理模式原理

代理模式就是给某一个对象创建一个代理对象,而由这个代理对象控制对原对象的引用,而创建这个代理对象就是可以在调用原对象是可以增加一些额外的操作。下面是代理模式的结构:

图 21. 代理模式的结构

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

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

Subject:抽象主题,它是代理对象的真实对象要实现的接口,当然这可以是多个接口组成。

ProxySubject:代理类除了实现抽象主题定义的接口外,还必须持有所代理对象的引用

RealSubject:被代理的类,是目标对象。

Spring 中如何实现代理模式

Spring Aop 中 Jdk 动态代理就是利用代理模式技术实现的。在 Spring 中除了实现被代理对象的接口外,还会有 org.springframework.aop.SpringProxy 和 org.springframework.aop.framework.Advised 两个接口。Spring 中使用代理模式的结构图如下:

图 22. Spring 中使用代理模式的结构图

$Proxy 就是创建的代理对象,而 Subject 是抽象主题,代理对象是通过 InvocationHandler 来持有对目标对象的引用的。

Spring 中一个真实的代理对象结构如下:

清单 10 代理对象 $Proxy4

public class $Proxy4 extends java.lang.reflect.Proxy implements    org.springframework.aop.framework.PrototypeTargetTests$TestBean   org.springframework.aop.SpringProxy   org.springframework.aop.framework.Advised {    java.lang.reflect.Method m16;    java.lang.reflect.Method m9;    java.lang.reflect.Method m25;    java.lang.reflect.Method m5;    java.lang.reflect.Method m2;    java.lang.reflect.Method m23;    java.lang.reflect.Method m18;    java.lang.reflect.Method m26;    java.lang.reflect.Method m6;    java.lang.reflect.Method m28;    java.lang.reflect.Method m14;    java.lang.reflect.Method m12;    java.lang.reflect.Method m27;    java.lang.reflect.Method m11;    java.lang.reflect.Method m22;    java.lang.reflect.Method m3;    java.lang.reflect.Method m8;    java.lang.reflect.Method m4;    java.lang.reflect.Method m19;    java.lang.reflect.Method m7;    java.lang.reflect.Method m15;    java.lang.reflect.Method m20;    java.la

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号