`
2007yn
  • 浏览: 44341 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Spring整合第三方MVC框架的通用配置

阅读更多
如果需要使用第三方MVC框架,则不能在web.xml文件中配置ApplicationContext的启动。但是,ApplicationContext是Spring的容器,负责管理所有的组件,从业务逻辑层组件,到持久层组件,都必须运行在Spring容器中。因此,必须在Web应用启动时,创建Spring的ApplicationContext实例。事实上,Spring ApplictionContext作为IoC容器,总应该优先加载。
不管采用怎样的方法,Spring容器都应该在应用启动时,自动加载。为了让Spring容器能自动加载,通常有两个做法:
1.让MVC框架负责创建ApplicationContext实例,MVC框架加载时自动创建Spring容器。Struts就是采用这种机制与Spring整合。
2.采用load-on-startup Servlet实现。
根据Servlet2.3标准,所有的ServletContextListener都会比Servlet优先加载——即使是load-on-startup Servlet。ApplicationContext实例是Spring容器,负责管理应用中所有的组件,包括业务逻辑层组件和持久层组件。因此,应该尽可能早的创建Spring容器。
为此,应该优先采用listener创建ApplicationContext。只是,ServletContextListener是从Servlet 2.3才出现的规范。如果使用了不支持Servlet2.3以上的Web服务器,则只能放弃ServletContextListener,采用load-on-startup Servlet策略。
Spring管理的组件相当多,如果将所有的组件部署在同一个配置文件里。不仅会降低配置文件的可读性,增大修改配置文件时引入错误的可能性,也不符合软件工程“分而治之”的规则。通常推荐服务层对象,业务逻辑对象,DAO对象都存在于互不相同的Context中,而表现层对象如Spring MVC控制器,则被配置在表现层Context中。甚至将某个特定模块的组件部署在单独的Context中。
实际的应用中,Spring的配置文件通常不只一个,而是按功能被分成多个。好在,所有负责加载Spring容器的工具都可同时加载多个配置文件。

一. 采用ContextLoaderListener创建ApplicationContext
使用ContextLoaderListener创建ApplicationContext必须服务器支持listener,下面这些服务器都是支持Listener的,如果使用这些服务器,则可以使用ContextLoaderListener创建ApplicationContext实例:
1.Apache Tomcat 4.x+ 。
2.etty 4.x+ 。
3.Resin 2.1.8+ 。
4.Orion 2.0.2+ 。
5.BEA WebLogic 8.1 SP3。
Spring提供ServletContextListener的一个实现类ContextLoaderListener,该类可以作为listener使用,它会在创建时候自动查找WEB-INF/下的applicationContext.xml文件,因此,如果只有一个配置文件,并且文件名为applicationContext.xml,只需在web.xml文件中增加如下一段即可:
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
如果有多个配置文件需要载入,则考虑使用<context-param>元素来确定配置文件的文件名。ContextLoaderListener加载时,会查找名为contextConfigLocation的参数。因此,配置context-param时参数名字应该是contextConfigLocation。
带多个配置文件的web.xml文件如下:
<!--  XML文件的文件头-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--  web.xml文件的DTD等信息-->
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!--  确定多个配置文件-->
在web.xml文件中加载Spring容器,这是最常见的做法。Spring自己的MVC框架就是采用这种策略。
关于让MVC框架负责创建ApplicationContext实例的情况比较多,因为每个MVC框架的启动机制有区别,因此加载ApplicationContext的方式也各有不同。
对于在web.xml配置文件中配置ApplicationContext的自动创建有两种策略:
1.利用ServletContextListener实现。
<context-param>
  <!--  参数名为contextConfigLocation -->
  <param-name>contextConfigLocation</param-name>
  <!--  多个配置文件之间以,隔开 -->
  <param-value>/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!--  采用listener创建ApplicationContext实例-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>
如果没有contextConfigLocation制定配置文件,Spring自动查找applicationContext.xml配置文件。
如果有contextConfigLocation,则利用该参数确定的配置文件,该参数指定的一个字符串,Spring的ContextLoaderListener负责将该字符串分解成多个配置文件,逗号“,”、空格“ ”、分号“;”都可作为字符串的分割符。
如果既然没有applicationContext.xml文件,也没有使用contextConfigLocation参数确定配置文件,或者contextConfigLocation确定的配置文件不存在,都将导致:Spring无法加载配置文件,无法正常创建ApplicationContext实例。
Spring根据bean定义创建 WebApplicationContext对象,并将其保存在Web应用的ServletContext中。大部分情况下,应用中的bean无需感受到ApplicationContext的存在,只要利用ApplicationContext的IoC即可。
如果需要在应用中获取ApplicationContext实例,可以通过如下方法获取:
WebApplicationContext ctx =
WebApplicationContextUtils.getWebApplicationContext(servletContext);
下面是采用Servlet获取ApplicationContext的完整源代码:
public class SpringTestServlet extends HttpServlet
{
//Servlet的响应方法。
public void service(HttpServletRequest request, HttpServletResponse response)
  throws ServletException,java.io.IOException
{z
  //获取Servlet的ServletContext对象
  ServletContext sc = getServletContext();
  //使用WebApplicationContextUtils类获得ApplicationContext
  WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sc);
  //获取Servlet的页面输出流
  PrintWriter out = response.getWriter();
  //将ApplicationContext对象输出
  out.println(ctx);
}
}
程序里手动获取ApplicationContext对象,然后直接输出到Servlet的响应。结果看到,ApplicationContext加载了web.xml文件中指定的两个配置文件。

二. 采用load-on-startup Servlet创建ApplicationContext
如果容器不支持Listener,则只能使用load-on-startup Servlet创建ApplicationContext实例,下面的容器都不支持Listener:
1.BEA WebLogic up to 8.1 SP2。
2.IBM WebSphere 5.x 。
3.Oracle OC4J 9.0.3。
Spring提供了一个特殊的Servlet类:ContextLoaderServlet。该Servlet在启动时,会自动查找WEB-INF/下的applicationContext.xml文件。
当然,为了让ContextLoaderServlet随应用启动而启动,应将此Servlet配置成load-on-startup的Servlet,load-on-startup的值小一点比较合适,因为要保证ApplicationContext优先创建。如果只有一个配置文件,并且文件名为:applicationContext.xml。在web.xml文件中增加如下一段即可:
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
该Servlet用于提供“后台”服务,作为容器管理应用中的其他bean,不需要响应客户请求,因此无需配置servlet-mapping。
如果有多个配置文件,一样使用<context-param>元素来确定多个配置文件。事实上,不管是ContextLoaderServlet,还是ContextLoaderListener,都依赖于ContextLoader创建ApplicationContext实例。在ContextLoader代码的第240行,有如下代码:
String configLocation = servletContext.getInitParameter(CONFIG_LOCATION_PARAM);
if (configLocation != null) {
wac.setConfigLocations(StringUtils.tokenizeToStringArray(configLocation,
ConfigurableWebApplicationContext.CONFIG_LOCATION_DELIMITERS));
}
其中CONFIG_LOCATION_PARAM是该类的常量,其值为contextConfigLocation。可看出:ContextLoader首先检查servletContext中是否有contextConfigLocation的参数,如果有该参数,则加载该参数指定的配置文件。带多个配置文件的web.xml文件如下:
<!--  XML文件的文件头-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--  web.xml文件的DTD等信息-->
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!--  确定多个配置文件-->
<context-param>
  <!--  参数名为contextConfigLocation -->
  <param-name>contextConfigLocation</param-name>
  <!--  多个配置文件之间以,隔开 -->
  <param-value>/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!--  采用load-on-startup Servlet创建ApplicationContext实例-->
<servlet>
  <servlet-name>context</servlet-name>
  <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
  <!--  下面值小一点比较合适,会优先加载-->
  <load-on-startup>1</load-on-startup>
</servlet>
</web-app>
测试所用的Servlet与前面所用的没有区别。ContextLoaderServlet与ContextLoaderListener底层都依赖于ContextLoader。因此,二者的效果几乎没有区别。之间区别不是它们本身引起的,而是由于Servlet2.3的规范:listener比servlet优先加载。因此,采用ContextLoaderListener创建ApplicationContext的时机更早。
当然,也可以通过ServletContext的getAttribute方法获取ApplicationContext,使用WebApplicationContextUtils类更便捷,因为无需记住ServletContext属性名。即使ServletContext的WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE属性没有对应对象,WebApplicationContextUtils的getWebApplicationContext()方法将会返回空,而不会引起异常。
获得了WebApplicationContext实例的引用后,可以通过bean的名字访问容器中的bean实例。大部分时候,无需通过这种方式访问容器中的bean。将表现层的控制器bean置入容器的管理中,客户端请求直接转发给容器中的bean,然后由容器管理bean之间的依赖,因此,无需手动获取ApplicationContext引用。当然,每个框架都会有自己特定的整合策略。
分享到:
评论

相关推荐

    网上商城,基于SpringMVC、Spring和Mybatis框架

    5. **支付模块**:与第三方支付平台接口对接,处理支付状态的回调,这通常需要异步处理和事务控制。 6. **后台管理系统**:管理员进行商品管理、订单审核、用户管理等,需要一套完善的后台界面和接口。 综上所述,...

    Spring + SpringMVC + Mybatis总结,同步博客中的pdf文档

    4. **与第三方框架的良好整合**:Spring 可以方便地与Hibernate、MyBatis等ORM框架,以及Struts2、Spring MVC等MVC框架集成,构建完整的应用系统。 【企业级项目特点】 企业级项目通常具有以下特点: - **用户数量...

    spring框架入门到熟练

    2. **技术集成**:Spring支持多种技术栈,例如JMS、JDBC、JTA等,并且能够很好地与其他第三方库集成。 3. **AOP支持**:Spring提供了丰富的AOP支持,可以帮助开发者轻松地添加跨切面的功能,比如事务管理、日志记录...

    Spring框架所需的核心类

    Spring框架是Java开发中广泛使用的轻量级框架,它的核心组件是其强大的功能基石。Spring以其依赖注入...同时,合理地管理和组织项目依赖,如正确配置`lib`目录下的第三方库,也是确保项目顺利运行的关键步骤。

    spring框架开发所需要用到的常用jar包

    此外,还支持资源访问、任务调度和各种第三方库的集成。 4. **spring-aop.jar**:实现了面向切面编程(Aspect Oriented Programming,AOP),允许开发者定义“切面”,将关注点分离,比如日志、事务管理等可以作为...

    Spring4+hibernate4+struts2整合框架

    在项目结构上,`lib`目录通常存放项目的依赖库,包括SSH框架的相关jar文件和其他必要的第三方库。而`src2`可能代表源代码的第二部分,通常包含Java源文件、资源文件、配置文件等。合理的目录结构有助于团队协作和...

    struts1整合spring及hibernate所需jar包

    4. **整合所需的其他jar包**:整合SSH时,还需要一些第三方库来协调这些框架之间的交互,如`commons-dbcp.jar`和`commons-pool.jar`用于数据库连接池,`commons-logging.jar`作为日志服务的抽象层,`log4j.jar`或`...

    spring mvc tomcat需要的依赖jar包

    - `aopalliance.jar`:Spring AOP框架依赖的一个第三方库,提供了一些通用的AOP接口。 - `commons-logging.jar`:日志抽象层,Spring使用它来实现日志记录。 - `jackson或json-processing-api.jar`:用于JSON序列...

    spring2.5.5

    6. **更多对第三方库的支持**:Spring 2.5.5增强了对各种流行库的兼容性,包括更新的ORM框架版本和其他第三方服务。 7. **Spring AOP增强**:这个版本对AOP代理进行了优化,提高了性能,并增加了更多AOP方面的功能...

    spring+struts2+hibernate框架

    在Spring和Struts2中,可以通过自定义拦截器或者使用第三方库(如DisplayTag或MyBatis的PageHelper)来实现分页。在Hibernate中,可以利用Criteria的setFirstResult和setMaxResults方法实现分页查询。 7. **项目...

    java框架所用的Stru2t+Spring4+hibernate4的架包

    Spring4还集成了众多第三方库,如Hibernate,使整合其他框架变得更加便捷。 **Hibernate4** 是一款持久化框架,它简化了Java应用与数据库之间的交互。通过ORM(Object-Relational Mapping,对象关系映射),...

    spring框架4.3.10+commons-logging-1.2的jar包

    它还支持国际化、邮件服务、任务调度以及与第三方库的集成,如JMX(Java管理扩展)。 2. **spring-core-4.3.10.RELEASE.jar**:这个包包含了Spring框架的基本功能,如依赖注入、资源加载和通用的工具类。它是其他...

    spring配置全书

    除此之外,书中可能还会涉及Spring Boot,这是一个快速启动Spring应用的框架,它简化了配置,提供了自动配置功能,并集成了许多常见的第三方库。Spring Boot的起步驱动程序(Starter POMs)可以帮助开发者快速搭建...

    基于javaspring 开发框架的培训教程 TP1.zip

    5. **Spring Boot**:近年来,Spring Boot成为Spring开发的主流方式,它简化了Spring应用的初始设置,提供了默认配置,并且集成了许多常见的第三方库,如Tomcat、JPA等,使得开发过程更加高效。 6. **数据访问集成*...

    系统通用框架

    同时,框架应提供良好的扩展性和插件机制,以便添加新的功能或者集成第三方服务。 在文件名"MySystem"中,我们可以推测这可能是这个通用框架的一个实例或核心组件。可能包含配置文件、实体类、控制器类、视图模板等...

    SSH中Spring所需基本jar包

    在开发过程中,根据项目需求,可能还需要添加其他的Spring模块或第三方库。例如,如果项目使用了Spring MVC,那么需要`spring-webmvc.jar`;如果需要处理WebSocket,可能还需要`spring-websocket.jar`等。总的来说,...

    通用后台管理系统(ExtJS 5.1 + Hibernate 4.1.7 + Spring MVC 3.2.8).pdf

    报表统计部分,可以嵌入第三方报表工具,增强数据分析能力。系统还集成了开源的互动地图库Leaflet,用于处理自定义在线地图,增强了地理信息的展示效果。 总的来说,这个通用后台管理系统是一个功能全面、技术先进...

    spring4jar包

    这些工具可以与JUnit和Mockito等第三方库配合使用,确保代码的质量和稳定性。 除此之外,Spring 4.1.3版本可能还包含了对Spring Expression Language (SpEL)的改进,这是一个强大的表达式语言,用于在运行时查询和...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)带标签

    这种设计允许开发者更加灵活地使用Spring框架,同时也更容易在项目中集成其他的第三方库。 总之,《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》通过对Spring框架的深入解析,帮助开发者理解其架构和...

Global site tag (gtag.js) - Google Analytics