详解Spring框架的设计理念与设计模式(4)

已有 3773人阅读此文 - - JAVA

Spring中设计模式分析

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

代理模式

代理模式原理

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

代理模式的结构

图21.代理模式的结构

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

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

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

Spring中如何实现代理模式

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

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.lang.reflect.Method m10;  
 
    java.lang.reflect.Method m1;  
 
    java.lang.reflect.Method m17;  
 
    java.lang.reflect.Method m21;  
 
    java.lang.reflect.Method m0;  
 
    java.lang.reflect.Method m13;  
 
    java.lang.reflect.Method m24;  
 
     
 
    int hashCode();  
 
    int indexOf(org.springframework.aop.Advisor);  
 
    int indexOf(org.aopalliance.aop.Advice);  
 
    boolean equals(java.lang.Object);  
 
    java.lang.String toString();  
 
    void sayhello();  
 
    void doSomething();  
 
    void doSomething2();  
 
    java.lang.Class getProxiedInterfaces();  
 
    java.lang.Class getTargetClass();  
 
    boolean isProxyTargetClass();  
 
    org.springframework.aop.Advisor; getAdvisors();  
 
    void addAdvisor(int, org.springframework.aop.Advisor)  
 
               throws org.springframework.aop.framework.AopConfigException;    
 
    void addAdvisor(org.springframework.aop.Advisor)    
 
               throws org.springframework.aop.framework.AopConfigException;    
 
    void setTargetSource(org.springframework.aop.TargetSource);    
 
    org.springframework.aop.TargetSource getTargetSource();    
 
    void setPreFiltered(boolean);  
 
    boolean isPreFiltered();  
 
    boolean isInterfaceProxied(java.lang.Class);  
 
    boolean removeAdvisor(org.springframework.aop.Advisor);  
 
    void removeAdvisor(int)throws org.springframework.aop.framework.AopConfigException;    
 
    boolean replaceAdvisor(org.springframework.aop.Advisor,    
 
               org.springframework.aop.Advisor)    
 
               throws org.springframework.aop.framework.AopConfigException;    
 
    void addAdvice(org.aopalliance.aop.Advice)    
 
               throws org.springframework.aop.framework.AopConfigException;    
 
    void addAdvice(int, org.aopalliance.aop.Advice)    
 
               throws org.springframework.aop.framework.AopConfigException;    
 
    boolean removeAdvice(org.aopalliance.aop.Advice);    
 
    java.lang.String toProxyConfigString();    
 
    boolean isFrozen();  
 
    void setExposeProxy(boolean);  
 
    boolean isExposeProxy();  
 
}

策略模式

策略模式原理

策略模式顾名思义就是做某事的策略,这在编程上通常是指完成某个操作可能有多种方法,这些方法各有千秋,可能有不同的适应的场合,然而这些操作方法都有可能用到。各一个操作方法都当作一 个实现策略,使用者可能根据需要选择合适的策略。

下面是策略模式的结构:

策略模式的结构

图23.策略模式的结构

Context:使用不同策略的环境,它可以根据自身的条件选择不同的策略实现类来完成所要的操作。它持有一个策略实例的引用。创建具体策略对象的方法也可以由他完成。

◆Strategy:抽象策略,定义每个策略都要实现的策略方法

◆ConcreteStrategy:具体策略实现类,实现抽象策略中定义的策略方法

◆Spring中策略模式的实现

◆Spring中策略模式使用有多个地方,如Bean定义对象的创建以及代理对象的创建等。这里主要看一下代理对象创建的策略模式的实现。

前面已经了解Spring的代理方式有两个Jdk动态代理和CGLIB代理。这两个代理方式的使用正是使用了策略模式。它的结构图如下所示:

Spring中策略模式结构图

图24.Spring中策略模式结构图

在上面结构图中与标准的策略模式结构稍微有点不同,这里抽象策略是AopProxy接口,Cglib2AopProxy和JdkDynamicAopProxy分别代表两种策略的实现方式,ProxyFactoryBean就是代表Context角色 ,它根据条件选择使用Jdk代理方式还是CGLIB方式,而另外三个类主要是来负责创建具体策略对象,ProxyFactoryBean是通过依赖的方法来关联具体策略对象的,它是通过调用策略对象的getProxy (ClassLoaderclassLoader)方法来完成操作。

总结

      本文通过从Spring的几个核心组件入手,试图找出构建Spring框架的骨骼架构,进而分析Spring在设计的一些设计理念,是否从中找出一些好的设计思想,对我们以后程序设计能提供一些思路。接着 再详细分析了Spring中是如何实现这些理念的,以及在设计模式上是如何使用的。

通过分析Spring给我一个很大的启示就是其这套设计理念其实对我们有很强的借鉴意义,它通过抽象复杂多变的对象,进一步做规范,然后根据它定义的这套规范设计出一个容器,容器中构建它们的 复杂关系,其实现在有很多情况都可以用这种类似的处理方法。

     虽然我很想把我对Spring的想法完全阐述清楚,但是所谓“书不尽言,言不尽意。”,有什么不对或者不清楚的地方大家还是看看其源码吧。


期待你一针见血的评论,Come on!