使用 web.xml 在 Spring 中加载上下文
Posted
技术标签:
【中文标题】使用 web.xml 在 Spring 中加载上下文【英文标题】:Loading context in Spring using web.xml 【发布时间】:2011-09-21 00:53:51 【问题描述】:有没有一种方法可以在 Spring MVC 应用程序中使用 web.xml 加载上下文?
【问题讨论】:
【参考方案1】:来自春季文档
Spring 可以轻松集成到任何基于 Java 的 Web 框架中。您需要做的就是在您的 web.xml 中声明 ContextLoaderListener 并使用 contextConfigLocation 来设置要加载的上下文文件。 p>
<context-param>
:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
然后您可以使用 WebApplicationContext 来获取您的 bean 的句柄。
WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servlet.getServletContext());
SomeBean someBean = (SomeBean) ctx.getBean("someBean");
更多信息请见http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/context/support/WebApplicationContextUtils.html
【讨论】:
如何访问上下文?你是说一旦应用程序启动,上下文就会被 Spring Context 加载?请澄清,因为我是Spring的新手,。感谢您的回复 这里是与 WebApplicationContextUtils 相关的最新 API 的链接。 docs.spring.io/spring-framework/docs/current/javadoc-api/org/…【参考方案2】:您还可以指定相对于当前类路径的上下文位置,这可能更可取
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
【讨论】:
*
的意义是什么?没有它就不行:IOException parsing XML document from ServletContext resource [/>classpath:/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/>classpath:/applicationContext.xml]
我刚刚发现一篇博文回答了我关于 classpath*
here 的问题。【参考方案3】:
您还可以在定义 servlet 本身时加载上下文 (WebApplicationContext)
<servlet>
<servlet-name>admin</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/*.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>admin</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
而不是(ApplicationContext)
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
或者可以同时做。
仅使用 WebApplicationContext 的缺点是它只会为这个特定的 Spring 入口点 (DispatcherServlet
) 加载上下文,而与上述方法一样,上下文将为多个入口点加载(例如 Webservice Servlet, REST servlet
等)
ContextLoaderListener
加载的上下文实际上是专门为 DisplacherServlet 加载的上下文的父上下文。因此,基本上您可以在应用程序上下文中加载所有业务服务、数据访问或存储库 bean,并分离出您的控制器,查看解析器 bean 到 WebApplicationContext。
【讨论】:
以上是关于使用 web.xml 在 Spring 中加载上下文的主要内容,如果未能解决你的问题,请参考以下文章
Spring Servlet 项目的 web.xml 中加载 contextConfigLocation 的顺序
Spring,无法在测试中加载 ApplicationContext
在 servlet 的 init() 中加载属性文件而不使用 web.xml 中的 context-param 标记 [重复]