在Java web的开发过程中,目前企业级应用程序采用较多的开发框架是SSH(Spring+SpringMVC+Hibernate,用SpringMVC来代替Struts)。本文通过阅读Spring的官方手册和源代码来分析Spring创建者的设计理念,主要梳理在使用Spring的过程中遇到的设计模式,以及Spring框架中各个核心组件之间的协同方式。
1.Spring框架简介
Spring框架是目前最流行的企业级开发框架之一,由Rod Johnson创建。Spring作为现在主流的企业级应用开发框架,创建的主要目的是为了解决企业应用开发的复杂性,对一些常用的企业级API提供一致的模型封装。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情,通过轻量级的容器来取代传统的EJB,简化企业应用的开发难度。
Spring框架是一个分层架构,由7个定义良好的模块组成。Spring模块构建在核心容器之上,核心容器定义了创建、配置和管理bean的方式,Spring框架的架构模式如图1所示。
图1 spring framework构架模式
2.Spring框架中设计模式的应用
Spring框架由多个模块组成,每个模块都有其特定的功能。各模块可以单独存在,也可以和其他一个或多个模块组合实现。为了实现各个模块的功能,创建者在设计Spring的时候采用了多种设计模式,下面文章中主要分析Spring框架中相对比较重要的几个模块所采用的实际模式。
2.1工厂模式(Factory pattern)
(1)定义
工厂模式是GOF23中设计模式之一,属于创建模式的一种。工厂模式可将Java对象的调用者从被调用者的实现逻辑中分离出来,调用者只需关心被调用者必须满足的规则(接口),而不必关心实例的具体实现过程。工厂模式由抽象产品(接口)、具体产品(实现类)、生产者(工厂类)三种角色组成。
(2)Spring中对工厂模式的应用
Spring中在各种BeanFactory以及ApplicationContext创建中都用到了典型的工厂方法模式,BeanFactory的设计原理如图2所示。
Spring Bean的体系结构比较复杂,顶级接口是BeanFactory;BeanFactory共有三个子接口:ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory,这三个子接口集成了顶级接口并对BeanFactory的功能进行了增强,称为二级接口;ConfigurableBeanFactory对二级接口HierarchicalBeanFactory进行了再次增强,它还继承了另一个外来的接口SingletonBeanRegistry,可以被称为三级接口;ConfigurableListableBeanFactory是一个更强大的接口,继承了上述的所有接口,称为四级接口。其余的为抽象类,实现了Spring Bean四级接口所定义的所有功能。
图2 BeanFactory的设计原理
2.2代理模式(Proxy pattern)
(1)定义
代理模式为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式由抽象角色、代理角色和真实角色三种角色组成。
(2)Spring中代理模式的应用
Spring的Proxy模式主要在Aop的实现中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy,用到了JDK的动态代理模式。Spring中使用代理模式的结构如图3所示。
图3 Spring使用代理模式的结构
$Proxy是创建的代理对象,Subject是抽象主题,代理对象是通过InvocationHandler来持有对目标对象的引用。除了实现被代理对象的接口外,还会有org.springframework.aop.SpringProxy和org.springframework.aop.framework.Advised两个接口。
2.3策略模式(Strategy pattern)
(1)定义
策略模式定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换,使得算法可独立于使用它的客户而变化。策略模式由抽象策略角色、具体策略角色和环境角色三种角色组成。
(2)Spring中策略模式的应用
Spring中在实例化对象的时候用到Strategy模式,结构如图4所示。Spring中抽象策略实现的核心是AopProxy接口;Cglib2AopProxy和JdkDynamicAopProxy集成了核心接口,分别代表两种策略的实现方式;ProxyFactoryBean代表Spring中的Context角色,它根据条件选择使用Jdk代理方式或者是CGLIB方式;而另外三个类主要是来负责创建具体策略对象;ProxyFactoryBean是通过依赖的方法来关联具体策略对象的,它是通过调用策略对象的getProxy(ClassLoader classLoader)方法来完成操作。
图4 Spring策略模式结构示意图
2.总结
本文通过从Spring的几个核心组件入手,试图找出构建Spring框架的骨骼架构,进而分析Spring在设计过程中的一些设计理念。主要分析了Spring构架和实现中所应用的工厂模式、代理模式和策略模式,从中学习到Spring作者的设计思想,对我们以后程序设计能提供一些思路。
spring源码也读了两遍了,但对于里面描述的关系还是不太清楚,以后再多读几遍吧,但总还有些收获的,下面就说说spring用到的设计模式主要有哪些:
1.工厂模式,这个很明显,在各种BeanFactory以及ApplicationContext创建中都用到了;
2.模版模式,这个也很明显,在各种BeanFactory以及ApplicationContext实现中也都用到了;
3.代理模式,在Aop实现中用到了JDK的动态代理;
4.策略模式,第一个地方,加载资源文件的方式,使用了不同的方法,比如:ClassPathResourece,FileSystemResource,ServletContextResource,UrlResource但他们都有共同的借口Resource;第二个地方就是在Aop的实现中,采用了两种不同的方式,JDK动态代理和CGLIB代理;
5.单例模式,这个比如在创建bean的时候。