Java 如何确定要使用哪个spring上下文?

Java 如何确定要使用哪个spring上下文?,java,spring,spring-mvc,Java,Spring,Spring Mvc,在Spring/MVC中,我常常难以确定应该定义哪个上下文bean,要么是root context.xml,要么是servlet context.xml。造成这种混乱的原因是,我没有看到关于这个主题的任何文档,比如放在哪里,在spring示例代码中,我经常看到在不同的示例上下文中定义相同的内容 根据经验,我目前已经在根上下文中定义了任何服务或组件,并为web控制器、拦截器和任何真正与web相关的内容保留了servlet上下文 但是安全呢?我现在已经将它定义为根上下文的一个包含,但是这是正确的吗

在Spring/MVC中,我常常难以确定应该定义哪个上下文bean,要么是
root context.xml
,要么是
servlet context.xml
。造成这种混乱的原因是,我没有看到关于这个主题的任何文档,比如放在哪里,在spring示例代码中,我经常看到在不同的示例上下文中定义相同的内容

根据经验,我目前已经在根上下文中定义了任何服务或组件,并为web控制器、拦截器和任何真正与web相关的内容保留了servlet上下文

但是安全呢?我现在已经将它定义为根上下文的一个包含,但是这是正确的吗

我的理解正确吗,web上下文实际上是应用程序根上下文的子上下文

为什么我们需要将web上下文分开


几年前,我阅读了3.0版本的spring文档,但记不起任何与此相关的内容,我还阅读了spring in Action第三版。我喜欢与此主题相关的任何材料。

默认情况下,当您仅在web.xml中指定DispatcherServlet时,它会检查
.context.xml
。 如果指定了contextConfigLocation,则默认情况下会检查
applicationContext.xml
如果指定了param值,则会检查特定文件

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>

org.springframework.web.context.ContextLoaderListener
上下文配置位置
/WEB-INF/classes/applicationContext.xml

您必须首先指定侦听器,以便指定文件而不是
.context.xml
,然后它会检查applicationContext。如果您没有指定任何内容,则它会检查applicationContext。如果您指定了contextConfigLocation,则它会检查自定义配置元数据

默认情况下,当您仅在web.xml中指定DispatcherServlet时,它会检查
.context.xml
。 如果指定了contextConfigLocation,则默认情况下会检查
applicationContext.xml
如果指定了param值,则会检查特定文件

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>

org.springframework.web.context.ContextLoaderListener
上下文配置位置
/WEB-INF/classes/applicationContext.xml
您必须首先指定侦听器,以便指定文件而不是
.context.xml
,然后它会检查applicationContext。如果您没有指定任何内容,则它会检查applicationContext。如果您指定了contextConfigLocation,则它会检查自定义配置元数据

为什么我们需要将web上下文分开

你没有。事实上,有几个官方的Spring示例将所有内容都塞进了一起

您可能希望将它们分开有几个原因。也许最有效的是可维护性:源文件越小(配置文件就是源文件),就越容易理解。另一个原因是一个给定的后端可能被多个前端使用

就我个人而言,我喜欢通过分离前端和后端来组合应用程序上下文,并简单地为我正在使用的后端导入上下文。这就剩下一个“servlet”上下文文件

为什么我们需要将web上下文分开

你没有。事实上,有几个官方的Spring示例将所有内容都塞进了一起

您可能希望将它们分开有几个原因。也许最有效的是可维护性:源文件越小(配置文件就是源文件),就越容易理解。另一个原因是一个给定的后端可能被多个前端使用

就我个人而言,我喜欢通过分离前端和后端来组合应用程序上下文,并简单地为我正在使用的后端导入上下文。这就剩下了一个“servlet”上下文文件。

可以而且通常是不同的

基本上,您的
applicationContext.xml
是您的根上下文,是您的服务和数据层bean所在的位置

*-servlet.xml
webmvc config.xml
的特殊之处在于:

  • 关联一个
    DispatcherServlet
  • 总是
    WebApplicationContext
    bean工厂
  • 是根上下文的子上下文(也可以是
    WebApplicationContext
但人们这样做的最大原因是为了单元测试,将前端与后端分离,以及单独的视图解析器和/或多个dispatcher servlet

这对单元测试很有好处,因为测试服务层时加载的bean更少。正如我在下面的评论中所说,我通常加载real
applicationContext.xml
如下:

@ContextConfiguration(locations = "classpath:/META-INF/spring/applicationContext.xml")
此外,由于servlet上下文需要一个dispatcher servlet,因此您需要将其注册为servlet,如下所示:

<servlet>
    <servlet-name>my-web</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/webmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

我的网络
org.springframework.web.servlet.DispatcherServlet
上下文配置位置
/WEB-INF/spring/webmvc-config.xml
1.
因此,虽然您可能能够使用根上下文加载我们的MVC控制器bean,但它们并没有真正注册,除非DispatcherServlet控制该上下文。虽然理论上我认为DispatcherServlet可以在类路径中加载配置,但是请注意contextConfigLocation值不在类路径中

还有一些人需要多个dispatcher servlet,这是因为您通常只能有一个解析器链(视图、区域设置、主题等)。可以而且通常是不同的

基本上,您的
applicationContext.xml
是您的根上下文,是您的服务和数据层bean所在的位置

*-servlet.xml
webmvc config.xml
的特殊之处在于: