Spring学习日记-Spring的bean配置文件路径问题
展开全文
在配置beans 的时候,可以使用 ContextLoaderListener 或者 ContextLoaderServlet搭配名为contextConfigLocation 的Context-Param,也可以在DispatchServlet的 init-param中定义。
但是其中要注意的是,无论如何,当web容器初始化DispatchServlet的时候,都会去这个它对于的配置文件。这个配置文件的默认位置和名字为/l。所以,即使已经使用了ContextLoaderListener或ContextLoaderServlet,配置文件 /l仍然是必须的。
有时候我们需要自定义所有的配置文件,比如,我希望把所有的spring相关的配置文件都放在目录/WEB-INF/spring/底下,我还希望用文件名 appContent-servlet来取代 l。举个例子:
我的配置文件l的相关部分如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/l
/WEB-INF/l spring framework和spring的关系
</param-value>
</context-param>
<listener>
<listener-class>
org.t.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/l其实就是原来默认名为/l的配置文件。
我们希望这个配置可以工作。但是很可惜,它无法正常启动。
为什么呢?原因就在于当web容器启动名为envoy的servlet的时候,它会尝试去加载bean定
义配置文件。即使我们已经使用了ContextLoaderListener来加载bean定义,它仍然会发现没有人为这个servlet定义其默认的配置文件,所以它会去尝试使用默认的路径和名字去加载文件。这个路径就是/l。可是我们已经把这个文件改名并放在路径/WEB-INF/l下了,web容器就会不到文件,并报错。
那么,我们该怎么办才能正确的配置所有的加载文件呢?我们可以用servlet配置的子节点init-param,而不要ContextLoaderListener或者ContextLoaderServlet。我们还是举个例子:
新的配置文件l的相关部分如下:
<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/l,
/WEB-INF/l
</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的配置文件,就导致了上面的结果。
由于时间不够,没有去确认是否其真实原因,等以后有空再去确认吧。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。