2007-01-08
Spring学习日记 - Spring的bean 配置文件路径问题
关键字: spring bean配置文件路径
在配置beans 的时候,可以使用 ContextLoaderListener 或者 ContextLoaderServlet搭配名为contextConfigLocation 的Context-Param,也可以在DispatchServlet的 init-param中定义。
但是其中要注意的是,无论如何,当web容器初始化DispatchServlet的时候,都会去找这个它对于的配置文件。这个配置文件的默认位置和名字为/WEB-INF/servletname-servlet.xml。所以,即使已经使用了ContextLoaderListener或ContextLoaderServlet,配置文件 /WEB-INF/servletname-servlet.xml仍然是必须的。
有时候我们需要自定义所有的配置文件,比如,我希望把所有的spring相关的配置文件都放在目录/WEB-INF/spring/底下,我还希望用文件名 appContent-servlet来取代 envoy-servlet.xml。举个例子:
我的配置文件web.xml的相关部分如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/appContent-servlet.xml
/WEB-INF/config/appContent-service.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>envoy</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
注意,其中的/WEB-INF/config/appContent-servlet.xml其实就是原来默认名为/WEB-INF/envoy-servlet.xml的配置文件。
我们希望这个配置可以工作。但是很可惜,它无法正常启动。
为什么呢?原因就在于当web容器启动名为envoy的servlet的时候,它会尝试去加载bean定义配置文件。即使我们已经使用了ContextLoaderListener来加载bean定义,它仍然会发现没有人为这个servlet定义其默认的配置文件,所以它会去尝试使用默认的路径和名字去加载文件。这个路径就是/WEB-INF/envoy-servlet.xml。可是我们已经把这个文件改名并放在路径/WEB-INF/config/appContent-servlet.xml下了,web容器就会找不到文件,并报错。
那么,我们该怎么办才能正确的配置所有的加载文件呢?我们可以用servlet配置的子节点init-param,而不要ContextLoaderListener或者ContextLoaderServlet。我们还是举个例子:
新的配置文件web.xml的相关部分如下:
<servlet>
<servlet-name>envoy</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/appContent-service.xml,
/WEB-INF/config/appContent-servlet.xml
</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
显然,新的配置更加简洁,而且这一次当web容器名为envoy的servlet的时候,系统可以发现这个servlet需要的名为contextConfigLocation的参数在这里,就会用客户定义的路径去取代默认的路径。
我的疑惑是,既然我们已经使用了context-param来定义contentConfigLocation这个变量,那么当web容器加载名为envoy的servlet的时候,就应该用这个路径来取代默认的路径才对,为什么事实却不是这样呢?
我估计原因是spring并不是配置的这个路径来指明DispatchServlet的配置文件的路径,而是用这个路径来为ContentLoaderListener或者ContentLoaderServlet指明其配置文件的路径。所以DispatchServlet仍然需要在启动的时候去加载该servlet的配置文件,就导致了上面的结果。
由于时间不够,没有去确认是否其真实原因,等以后有空再去确认吧。
但是其中要注意的是,无论如何,当web容器初始化DispatchServlet的时候,都会去找这个它对于的配置文件。这个配置文件的默认位置和名字为/WEB-INF/servletname-servlet.xml。所以,即使已经使用了ContextLoaderListener或ContextLoaderServlet,配置文件 /WEB-INF/servletname-servlet.xml仍然是必须的。
有时候我们需要自定义所有的配置文件,比如,我希望把所有的spring相关的配置文件都放在目录/WEB-INF/spring/底下,我还希望用文件名 appContent-servlet来取代 envoy-servlet.xml。举个例子:
我的配置文件web.xml的相关部分如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/appContent-servlet.xml
/WEB-INF/config/appContent-service.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>envoy</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
注意,其中的/WEB-INF/config/appContent-servlet.xml其实就是原来默认名为/WEB-INF/envoy-servlet.xml的配置文件。
我们希望这个配置可以工作。但是很可惜,它无法正常启动。
为什么呢?原因就在于当web容器启动名为envoy的servlet的时候,它会尝试去加载bean定义配置文件。即使我们已经使用了ContextLoaderListener来加载bean定义,它仍然会发现没有人为这个servlet定义其默认的配置文件,所以它会去尝试使用默认的路径和名字去加载文件。这个路径就是/WEB-INF/envoy-servlet.xml。可是我们已经把这个文件改名并放在路径/WEB-INF/config/appContent-servlet.xml下了,web容器就会找不到文件,并报错。
那么,我们该怎么办才能正确的配置所有的加载文件呢?我们可以用servlet配置的子节点init-param,而不要ContextLoaderListener或者ContextLoaderServlet。我们还是举个例子:
新的配置文件web.xml的相关部分如下:
<servlet>
<servlet-name>envoy</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/appContent-service.xml,
/WEB-INF/config/appContent-servlet.xml
</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
显然,新的配置更加简洁,而且这一次当web容器名为envoy的servlet的时候,系统可以发现这个servlet需要的名为contextConfigLocation的参数在这里,就会用客户定义的路径去取代默认的路径。
我的疑惑是,既然我们已经使用了context-param来定义contentConfigLocation这个变量,那么当web容器加载名为envoy的servlet的时候,就应该用这个路径来取代默认的路径才对,为什么事实却不是这样呢?
我估计原因是spring并不是配置的这个路径来指明DispatchServlet的配置文件的路径,而是用这个路径来为ContentLoaderListener或者ContentLoaderServlet指明其配置文件的路径。所以DispatchServlet仍然需要在启动的时候去加载该servlet的配置文件,就导致了上面的结果。
由于时间不够,没有去确认是否其真实原因,等以后有空再去确认吧。
- 20:57
- 浏览 (1238)
- 评论 (3)
- 分类: Spring和持久层
- 相关推荐
评论
Frederick
2008-01-25
个人认为,这个是spring-mvc的bug
Frederick
2008-01-25
你的说法其实就是我的第一段:
在配置beans 的时候,可以使用 ContextLoaderListener 或者 ContextLoaderServlet搭配名为contextConfigLocation 的Context-Param,也可以在DispatchServlet的 init-param中定义。
我说的是,即使这样还不够。我看过源代码,DispatchServlet有读取配置文件的代码。如果你不配置<init-param>,就会去默认的路径下读取配置文件。
引用
在配置beans 的时候,可以使用 ContextLoaderListener 或者 ContextLoaderServlet搭配名为contextConfigLocation 的Context-Param,也可以在DispatchServlet的 init-param中定义。
我说的是,即使这样还不够。我看过源代码,DispatchServlet有读取配置文件的代码。如果你不配置<init-param>,就会去默认的路径下读取配置文件。
chorpin
2008-01-25
兄弟,你以上所说好像有点不准确吧,直接用
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/appContent-servlet.xml
/WEB-INF/config/appContent-service.xml
</param-value>
</context-param>
搭配上ContextLoaderListener 就可以正常工作了,并不一定要<init-param>节点的。你的不能正常使用,可能是一些别的原因吧
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/appContent-servlet.xml
/WEB-INF/config/appContent-service.xml
</param-value>
</context-param>
搭配上ContextLoaderListener 就可以正常工作了,并不一定要<init-param>节点的。你的不能正常使用,可能是一些别的原因吧
发表评论
- 浏览: 16634 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
链接
最新评论
-
apachet转发请求到tomcat ...
很老的问题了,一般实际开发都是这样做的,至少我们用的tomcat5.0.28是这 ...
-- by jhj823900 -
jBPM的Scheduler模块和Sp ...
提示个方法。。用JobExecutorServlet方法来代替你的Schedul ...
-- by gabriel80 -
spring 学习日记 - 基于 ...
ms可以这样 <bean class="org.springframewo ...
-- by sgfgh -
如何实现Spring管理下的不 ...
如果是使用CFX的前身XFire时,使用的FactoryBean是org.cod ...
-- by ununreal -
如何实现Spring管理下的不 ...
引用服务端中途断掉又连上呢?应该没有影响的吧,http无状态 我的经验是如果初始 ...
-- by Frederick






评论排行榜