applicationContext 是如何加载的?

How applicationContext was loaded?

web.xml的内容

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/krams/*</url-pattern>
</servlet-mapping>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

WEB.INF 中也有一个 applicationContext.xml 文件,但 web.xml 中没有。它是如何加载的?

ContextLoaderListerner, ContextLoader and XmlWebApplicationContext类负责加载applicationContext.xml。

请在 git 上查看他们的源代码。

你会发现ContextLoaderListerner is extending ContexLoader

ContextLoader 文档中,他们提到:

 * If not explicitly specified, the context implementation is supposed to use a
 * default location (with XmlWebApplicationContext: "/WEB-INF/applicationContext.xml").

并且这个值在XmlWebApplicationContext中提到如下(如果你需要的话,还有其他常量值):

/** Default config location for the root context */
public static final String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml";

/** Default prefix for building a config location for a namespace */
public static final String DEFAULT_CONFIG_LOCATION_PREFIX = "/WEB-INF/";

/** Default suffix for building a config location for a namespace */
public static final String DEFAULT_CONFIG_LOCATION_SUFFIX = ".xml";

这就是 applicationContext.xml 文件虽然未在 web.xml 文件中配置但仍被加载的原因。您将需要一些时间来理解 Spring.

使用的所有这些默认配置(魔法)