Spring在web中的配置方式
如果需要使用第三方MVC框架,则不能在l文件中配置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+ 。
< 4.x+ 。
3.Resin 2.1.8+ 。
4.Orion 2.0.2+ 。
5.BEA WebLogic 8.1 SP3。
Spring提供ServletContextListener的一个实现类ContextLoaderListener,该类可以作为listener 使用,它会在创建时候自动查WEB-INF/下的l文件,因此,如果只有一个配置文件,并且文件名为l,只需在l文件中增加如下一段即可:
<listener>
<listener-class>org.t.ContextLoaderList ener</listener-class>
</listener>
如果有多个配置文件需要载入,则考虑使用<context-param>元素来确定配置文件的文件名。ContextLoaderListener加载时,会查名为contextConfigLocation的参数。因此,配置context- param时参数名字应该是contextConfigLocation。
带多个配置文件的l文件如下:
<!-- XML文件的文件头-->
<?xml version="1.0" encoding="ISO-8859-1"?>spring怎么读多个文件
<!-- l文件的DTD等信息-->
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "java.sun/dtd/web-app_2_3.dtd">
<web-app>
<!-- 确定多个配置文件-->
在l文件中加载Spring容器,这是最常见的做法。Spring自己的MVC框架就是采用这种策略。
关于让MVC框架负责创建ApplicationContext实例的情况比较多,因为每个MVC 框架的启动机制有区别,因此加载ApplicationContext的方式也各有不同。对于在l配置文件中配置ApplicationContext的自动创建有两种策略:1.利用ServletContextListener实现。
<context-param>
<!-- 参数名为contextConfigLocation -->
<param-name>contextConfigLocation</param-name>
<!-- 多个配置文件之间以,隔开 -->
<param-value>/l,/WEB-INF/applicationContext.x ml</param-value>
</context-param>
<!-- 采用listener创建ApplicationContext实例-->
<listener>
<listener-class>org.t.ContextLoader Listener</listener-class>
</listener>
</web-app>
如果没有contextConfigLocation制定配置文件,Spring自动查l配置文件。
如果有contextConfigLocation,则利用该参数确定的配置文件,该参数指定的一个字符串,Spring的Co
ntextLoaderListener负责将该字符串分解成多个配置文件,逗号“,”、空格“ ”、分号“;”都可作为字符串的分割符。
如果既然没有l文件,也没有使用contextConfigLocation参数确定配置文件,或者 contextConfigLocation确定的配置文件不存在,都将导致:Spring无法加载配置文件,无法正常创建ApplicationContext实例。
Spring根据bean定义创建 WebApplicationContext对象,并将其保存在Web 应用的ServletContext中。大部分情况下,应用中的bean无需感受到ApplicationContext的存在,只要利用ApplicationContext的IoC即可。
如果需要在应用中获取ApplicationContext实例,可以通过如下方法获取:WebApplicationContext ctx =
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 = WebApplicationContext(sc);
//获取Servlet的页面输出流
PrintWriter out = Writer();
//将ApplicationContext对象输出
out.println(ctx);
}
}
程序里手动获取ApplicationContext对象,然后直接输出到Servlet的响应。结果看到,ApplicationContext加载了l文件中指定的两个配置文件。
二. 采用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/下的l文件。
当然,为了让ContextLoaderServlet随应用启动而启动,应将此Servlet配置成load-on-startup的Servlet, load-on-startup的值小一点比较合适,因为要保证ApplicationContext优先创建。如果只有一个配置文件,并且文件名为:l。在l文件中增加如下一段即可:
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.t.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 = InitParameter(CONFIG_LOCATION_PARAM);
if (configLocation != null) {
wac.kenizeToStringArray(configLocati on,
ConfigurableWebApplicationContext.CONFIG_LOCATION_DELIMITERS));
}
其中CONFIG_LOCATION_PARAM是该类的常量,其值为contextConfigLocation。可看出:ContextLoader 首先检查servletContext中是否有contextConfigLocation的参数,如果有该参数,则加载该参数指定的配置文件。带多个配置文件的l文件如下:
<!-- XML文件的文件头-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- l文件的DTD等信息-->
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "java.sun/dtd/web-app_2_3.dtd">
<web-app>
<!-- 确定多个配置文件-->
<context-param>
<!-- 参数名为contextConfigLocation -->
<param-name>contextConfigLocation</param-name>
<!-- 多个配置文件之间以,隔开 -->
<param-value>/l,/WEB-INF/applicationContext.x ml</param-value>
</context-param>
<!-- 采用load-on-startup Servlet创建ApplicationContext实例-->
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.t.ContextLoaderServle t</servlet-class>
<!-- 下面值小一点比较合适,会优先加载-->
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
测试所用的Servlet与前面所用的没有区别。ContextLoaderServlet与
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论