Spring 实现两种设计模式
在 Spring 中大量使用的以下两种设计模式:


Spring开源框架、分层架构、模块独立。低侵入性。


Spring Ioc容器(控制反转),DI(依赖注入)。setter方法注入和构造器注入、接口注入3种注入方式。


Spring AOP特性,面向切面编程。配置事务隔离性。查询没必要配置事务的隔离性。


Spring JDBC比传统的JDBC节省代码,它不管连接、不管事务、不管异常、不管关闭都由Spring提供了统一管理。



Spring 的Ioc(控制反转)主要用到工厂模式和Java的反射机制。通过Java的反射机制,获得bean的class,通过newInstance()获得该类实例和该类方法,再调用invoke()方法。



而Spring的AOP用到的是代理模式。代理模式就是不让外部直接访问具体目标,而是需要通过一个代理类代替访问,所有与具体目标的通信都需要这个代理类处理。AOP一般用于实现哪些与业务无关,但是业务模块所共同调用的逻辑,例如事务管理、日志管理、权限控制。AOP将这些代码封装起来,减少了重复代码,降低模块耦合度。


 


工厂模式

工厂模式可将 Java 对象的调用者从被调用者的实现逻辑中分离出来,调用者只需关心被调用者必须满足的规则(接口) ,而不必关心实例的具体实现过程。
这是面向接口编程的优势,能提高程序的解稿,避免所有的类以硬编码方式糯合在一起。
如果所有的类直接祸合,极易形成"骨牌效应",
假如 B 类调用了 A 类,一旦 A 类需要修改,则 B 类也需要修改:假如 C 类调用了 B 类,则 C 类也需要修改......依次类推,从而导致整个系统都需要改写。
造成"牵一发而动全身",而系统重构的代价是相当高的。
Spring 倡导"面向接口编程飞可以避免上述的问题,使设计良好的架构可保证系统重构的i作被封闭在重构的层内,绝不会影响其他层,这可以在本书后面的示例中看到。
Spring 容器是实例化和管理全部 bean 的工厂,

单态模式
Spring 默认将所有的 bean 设置成单态模式,无须自己完成单态模式,即对所有相同id 的 bean 请求都将返回同一个共享实例。
因此,单态模式可大大降低 Java 对象在创建和销毁时的系统开销。

派遣器模式
  Spring有一个统一集中的派遣器org.springframework.web.servlet.DispatcherServlet,
  一般在web.xml中把所有的页面 请求都发送到该派遣器:
 

<servlet>
   <servlet-name>countries</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <load-on-startup>2</load-on-startup>
   </servlet> 
   <servlet-mapping>
   <servlet-name>countries</servlet-name>
   <url-pattern>*.htm</url-pattern>
   </servlet-mapping>


  

控制器 模式
  派遣器收到请求后,把不同的页面派遣到不同的控制器进行处理:

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
   <property name="mappings">
    <props>
    <prop key="/home.htm">countriesController</prop>
    <prop key="/notfound.htm">errorsController</prop>
    </props>
   </property>
   </bean>


  Spring有两种MAPPING的机制,默认为BeanNameUrlHandlerMapping,
我们这里采用的是
 

SimpleUrlHandlerMapping.


 

拦截器模式
  在控制器处理前,我们可以将其拦截,进行一些特殊或通用处理;拦截器可以选用Spring已经实现
  的或我们自己实现的:
 

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
   <property name="interceptors">
    <list>
   <ref local="localeChangeInterceptor"/>
    <ref local="themeChangeInterceptor"/>
    <ref local="copyInterceptor"/>
    </list>
   </property>
   </bean>


 其实我们在平常的开发中,也经常用到上面的设计模式 ;只是Spring的实现比较优美,所以Spring
  能很快流行.