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

2020-02-21 22:17

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参数,整个代理就是这样实现的。

2. Spring AOP如何实现

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

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

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

图18. Jdk动态代理的类图

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

清单9.配置代理类Bean

class=\

org.springframework.aop.framework.PrototypeTargetTests$TestBean

testInterceptor testInterceptor2

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

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

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

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

图19.Spring代理对象的产生

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

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

图20.Spring调用拦截器

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

三、 Spring中设计模式分析

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

1. 代理模式

1.1 代理模式原理

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

图21. 代理模式的结构

? ? ?

Subject:抽象主题,它是代理对象的真实对象要实现的接口,当然这可以是多个接口组成 ProxySubject:代理类除了实现Subject定义的接口外,还必须持有所代理对象的引用 RealSubject:被代理的类,是目标对象

1.2 Spring中如何实现代理模式

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


Spring框架的设计理念与设计模式分析(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:留学生求职除了排队交简历,春招 Career Fair 上你还该做什么?

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: