2010-09-13 96 views
9

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

<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顶级豆配置文件 - 即一个Servlet之外。这是什么意思?这是用于跨Servlet bean吗?有时它位于src/main/webapp/WEB-INF目录中,有时位于src/main/resources。另外我还看过WAR模块中定义的其他bean配置文件,其中几乎所有内容都在src/main/resources中。

我已阅读并重新阅读Spring文档,但我发现的唯一的惯例是,默认情况下,servlet上下文配置文件应命名为{servlet-name}-servlet.xmlsrc/main/webapp/WEB-INF目录。

那么最佳做法是什么?为什么?

回答

12

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

典型的Spring MVC Web应用程序包含有两个级别的层级:由ContextLoaderListener加载

  • 根Web应用程序上下文。 默认情况下,此上下文的配置位置为applicationContext.xml,可以使用名为contextConfigLocation<context-param>进行配置,即位于顶级web.xml。该上下文通常包含核心应用程序逻辑。

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

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

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

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

+0

非常有帮助 - 谢谢。希望这个在Spring文档中得到了很好的解释! – HDave 2010-09-13 19:54:16

+0

@HDave这不是Spring特有的,它是普通的java类加载器行为(唯一的特定于spring的是'classpath:'前缀) – 2010-09-14 06:51:37

2

我认为将代码及其弹簧配置保存在包含在WAR中的单独JAR中,这样WAR基本上是空的,但是对于web.xml等来说,这是很好的风格。这甚至可以避免你问这个问题。 :-)你可以用classpath:前缀引用这些弹簧配置。

这种布局的一个优点是你可以很容易地编写Unittests来实例化JAR中WAR的完整Spring配置。我不一定建议在实际测试中使用它(尽管你可以用这种方式进行集成测试),但是当你偶然地中断配置文件的整体结构而不必重新部署应用程序时,你会得到一个快速反馈。

如果你真的需要把WAR配置文件放到WAR中(也许因为它也引用了在WAR中实现的bean),我也会把它们放到正常的资源路径/ WEB-INF/classes中,上面讨论的原因。

+0

我同意这一点,并且已经在这些模块JAR中具有所有模块级别的Spring配置文件 - 正是你提到的原因......集成测试。但是,我仍然有WAR级别的Spring配置文件,它们会创建实例以供servlet容器使用,等等。我最终将它们放在{{webapp}}目录中。 – HDave 2012-04-02 19:15:48

+0

@HDave我会把这样的文件放到/ WEB-INF /类中,以使它们也在类路径中。所以你至少可以对它们进行单元测试。 – 2012-11-02 12:18:19