使用 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 [/&gt;classpath:/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/&gt;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 标记 [重复]

如何在 JUnit 中加载应用程序上下文并使用 Autowired

Spring Struts2 整合

如何在 Spring Boot 测试中加载仅添加命名组件的基本 Spring Application-Context?