我查看了一堆示例项目,但似乎无法梳理出常见的最佳实践。我见过 Spring bean 配置文件有时会进入 src/main/webapp/WEB-INF
。目录。我已经结合 web.xml
中的 Servlet 定义看到了这一点。像这样:
<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>
但是我也看到了包含在
web.xml
中的 bean 配置文件。顶层——即在 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
的目录.那么最佳实践是什么,为什么?
最佳答案
Spring 中的应用程序上下文可以形成层次结构,其中子上下文可以访问父上下文中定义的 bean。
典型的 Spring MVC Web 应用程序包含具有两个级别的层次结构:
ContextLoaderListener
加载的根 Web 应用程序上下文.此上下文的配置位置是
applicationContext.xml
默认情况下,可以使用 <context-param>
进行配置命名为 contextConfigLocation
,即在 web.xml
的顶层.此上下文通常包含核心应用程序逻辑。 DispatcherServlet
加载的 Servlet 特定上下文.它的配置位置默认为 <servletname>-servlet.xml
并且可以使用 <init-param>
进行配置命名为 contextConfigLocation
,即在 servlet 级别。这个上下文通常包含一个 Spring MVC 相关的东西( Controller 等),因为 DispatcherServlet
是 Spring MVC 的一部分。 后一个上下文是前一个的子上下文。
如果 Web 应用程序不使用 Spring MVC 作为表示框架,则它没有
DispatcherServlet
及其上下文。一些极其简单的 Spring MVC 示例没有 ContextLoaderListener
和根上下文(但是,您需要根上下文来实现跨 servlet 功能,例如 Spring Security)。Web 应用程序的配置文件默认位于 webapp 的根文件夹中。但是,它们可以放在类路径中(即在
src/main/webapp
中),在这种情况下,它们可以通过 classpath:
访问。字首。如果您打算在没有 servlet 容器的集成测试中使用其中一些文件,这可能会很有用。还有classpath:
当您想从单独的工件(即 /WEB-INF/lib
中的 jar 文件)加载配置文件时,前缀可能很有用。 .
关于spring - Spring bean 配置文件在 Maven WAR 模块中的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3703389/