Spring(之三)-- Spring整合Struts,Hibernate

来源:互联网 发布:怎么安装python 编辑:程序博客网 时间:2024/06/02 09:10

Spring整合Struts

在web应用中创建Spring容器有如下两种方式:

  • 直接在web.xml文件中创建Spring容器
  • 利用第三方MVC框架的扩展点,创建Spring容器

对于轻量级的JavaEE应用,工厂模式是更实际的策略,业务逻辑不是EJB,通常是一个POJO,业务逻辑组件的生成通常由工厂负责,而且工厂可以保证该组件的实例只需要一个就够了,可以避免重复实例化造成的系统开销。

下面是采用工厂模式的顺序图
这里写图片描述

控制器如何访问到容器中的业务逻辑组件呢?为了让Action访问到Spring的业务逻辑组件,有两种策略:

  • Spring容器负责管理控制器Action,并利用依赖注入为控制器注入业务逻辑组件
  • 利用Spring的自动装配,Action将会自动从Spring容器中获取所需的业务逻辑组件

让Spring管理控制器

在Struts单独使用时,是由struts核心控制器首先拦截到用户请求,然后将请求转发给对应的Action处理,在此过程中,Struts将负责创建Action实例,调用其execute()方法。现在的情形是:如果把action实例交由Spring容器来管理,而不是由Struts产生,现在需要一个插件,来让核心控制器知道调用Spring容器中的Action而不是自行创建的。这个插件是struts-spring-plugin.jar。
Spring插件提供了一种伪Action,在struts.xml文件中配置Action时通常需要制定class属性,该属性就是用于创建Action实例的实现类。但这个插件允许制定class属性时,不在指定Action的实际实现类,而是指定为Spring容器中的BeanId,这样Struts将不再自己负责创建Action。
整合关键:当Struts将请求转发给指定的Action时,Struts中的Action只是一个代号,并没有指定实际的实现类,当然也不可创建Action,而隐藏在该Action下的是Spring容器中的Action实例,它才是真正处理处理请求的控制器。

下面为Spring管理Action的协作图

这里写图片描述

这种策略的不足之处

  • Spring管理Action,必须将所有的Action配置在Spring中,而struts.xml文件中好需要配置一个伪Action,导致配置文件臃肿。
  • Action的业务逻辑组件接受容器注入,将导致代码可读性降低。

使用自动装配

通过设置struts.objectFactory.spring.autoWire常亮可以改变Spring插件的自动装配策略,该常量可接受

  • name
  • type
  • auto
  • constuctor

这种策略的不足之处
- Action接收Spring容器的自动装配,代码的可读性较差
- Action与业务逻辑组件的耦合降低到代码层次,必须在配置文件中配置与Action所需控制器同名的业务逻辑组件,这不利于高层次解耦

总结,整合Spring框架与不整合存在区别,这个区别不在这个配置文件中体现,而是在创建该Action实例时体现出来。如果不整合,则Struts框架负责创建Action实例,创建成功就结束了;如果整合Spring框架,则当Action实例创建完成后,Spring插件还会负责该Action所需的业务逻辑组件注入给该Action实例。

Spring整合Hibernate

DAO模式是一种标准的Java EE设计模式,DAO模式的核心思想是,所有的数据访问都通过DAO组建完成,DAO组件封装了数据库的增、删、改等原子操作。业务逻辑依赖于DAO组件提供的数据库原子操作,完成系统业务逻辑的实现。
JavaEE应用都大致可分为如下三层

  • 表现层
  • 业务逻辑层
  • 数据持久层

轻量级Java EE架构以Spring IOC容器为核心,承上启下:向上管理来自表现层的Action,向下管理业务逻辑层组件,同时负责管理业务逻辑层所需的DAO对象。

下图是轻量级Java EE应用架构
这里写图片描述

管理Hibernate的SessionFactory

当通过Hibernate进行持久层访问时,必须先获得SessionFactory对象,它是单个数据库映射关系
编译后的内存镜像。在大部分情况下,一个JavaEE应用对应一个数据库,即对应一个SessionFactory。在纯粹的Hibernate访问中,应用程序需要手动创建SessionFactory,这不是一个好的策略。Spring的IoC容器正好提供了这种管理方式,它不仅能以声明式的方式配置SessionFactory实例,也可以充分利用IoC容器的作用,为SessionFactory注入数据源引用。

从用户角度来看,用户发出HTTP请求,当MVC框架的控制器组件拦截到用户请求时,将调用系统的业务逻辑组件,业务逻辑组件则调用系统的DAO组件,而DAO组件则依赖于SessionFactory和DataSource等底层组件实现数据库访问。
从系统实现角度看,IoC容器创建SessionFactory和DataSource等底层组件,然后将这些底层组件注入给DAO组件,提供一个完整的DAO组件,并将此DAO组件注入给业务逻辑组件,从而提供一个完整的业务逻辑组件,而业务逻辑组件又被注入给控制器组件,控制器组件负责拦截用户请求,并将处理结果呈现给用户,这一系列衔接都有Spring 的IoC容器提供实现。

下面是Java EE应用各组件之间的调用关系
这里写图片描述

0 0