Spring bean配置文件在Maven WAR模块中的位置是什么?

HDa*_*ave 9 configuration spring maven-2 servlets war

我看了一堆示例项目,似乎无法梳理一个常见的最佳实践.我见过Spring bean配置文件有时会进入src/main/webapp/WEB-INF目录.我已经在这样的Servlet定义中看到了web.xml这个:

<servlet>
    <servlet-name>my-stuff</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/my-stuff-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
Run Code Online (Sandbox Code Playgroud)

但我也看到bean配置文件包含在web.xml顶层 - 即在Servlet之外.这是什么意思?这是跨Servlet bean吗?有时它在src/main/webapp/WEB-INF目录中,有时它在src/main/resources.此外,我已经看到了WAR模块中定义的其他bean配置文件,其中包含几乎所有内容src/main/resources.

我已经阅读并重新阅读了Spring文档,但我发现的唯一约定是默认情况下Servlet上下文配置文件应该在src/main/webapp/WEB-INF名为的目录中{servlet-name}-servlet.xml.

那么最佳实践是什么?为什么?

axt*_*avt 12

Spring中的应用程序上下文可以形成层次结构,其中子上下文可以访问父上下文中定义的bean.

典型的Spring MVC Web应用程序包含两个级别的层次结构:

  • 加载的根Web应用程序上下文ContextLoaderListener.applicationContext.xml默认情况下,此上下文的配置位置可以使用<context-param>named 配置contextConfigLocation,即在顶层web.xml.此上下文通常包含核心应用程序逻辑.

  • 加载的Servlet特定上下文DispatcherServlet.它的配置位置是默认的<servletname>-servlet.xml,可以使用<init-param>named 配置contextConfigLocation,即在servlet级别配置.这个上下文通常包含一个与Spring MVC相关的东西(控制器等),因为它DispatcherServlet是Spring MVC的一部分.

后一种情况是前者的孩子.

如果Web应用程序不使用Spring MVC作为表示框架,则它没有DispatcherServlet及其上下文.一些非常简单的Spring MVC示例没有ContextLoaderListener和根上下文(但是,您需要root上下文来实现跨Servlet功能,例如Spring Security).

Web应用程序的配置文件默认位于webapp的根文件夹中.但是,它们可以放在类路径中(即in src/main/webapp),在这种情况下,它们可以通过classpath:前缀访问.如果要在没有servlet容器的集成测试中使用其中一些文件,这可能很有用.此外classpath:,当你想从一个单独的神器,从一个jar文件,即加载配置文件的前缀可能是有用的/WEB-INF/lib.