Spring源码解析-ApplicationContext和WebApplicationContext

221 阅读2分钟

ApplicationContext

为应用程序提供配置的中央接口。这在应用程序运行时是只读的,但如果实现支持,则重新加载。ApplicationContext 提供:用于访问应用程序组件的 Bean 工厂方法。

继承自 {@linkorg.springframework.beans.factory.ListableBeanFactory}以通用方式加载文件资源的能力。

继承自 {@link org.springframework.core.io.ResourceLoader} 接口,能够将事件发布到注册的侦听器。 继承自 {@link ApplicationEventPublisher} 接口,解析消息的能力,支持国际化。

继承自 {@link MessageSource} 接口,从父上下文继承。后代上下文中的定义将永远优先。这意味着,例如,单亲上下文可以被整个 Web 应用程序使用,而每个 servlet 都有它自己的子上下文独立于任何其他 servlet 的子上下文。

除了标准的 {@link org.springframework.beans.factory.BeanFactory}生命周期功能,ApplicationContext 实现检测和调用{@link ApplicationContextAware} bean 以及 {@link ResourceLoaderAware}, {@link ApplicationEventPublisherAware} 和 {@link MessageSourceAware} bean。

WenApplicationContext:

为 Web 应用程序提供配置的接口,这是只读的,而应用程序正在运行,但如果实现支持,可能会重新加载。

该接口添加了一个 {@code getServletContext()} 方法,ApplicationContext 接口,并定义了一个众所周知的应用程序属性名称,在引导过程中必须绑定根上下文。

与通用应用程序上下文一样,Web 应用程序上下文也是分层的。每个应用程序有一个根上下文,而应用程序中的每个 servlet(包括 MVC 框架中的调度程序 servlet)有自己的子上下文。除了标准的应用上下文生命周期能力,WebApplicationContext 实现还需要检测 {@link ServletContextAware} bean 并相应地调用 {@code setServletContext} 方法。

XmlWebApplicationContext:

{@link org.springframework.web.context.WebApplicationContext} 实现类 它从 XML 文档中获取其配置,由 {@link org.springframework.beans.factory.xml.XmlBeanDefinitionReader}来实现。

本质上相当于 {@link org.springframework.context.support.GenericXmlApplicationContext} 用于web环境。

默认情况下,配置将从“/WEB-INF/applicationContext.xml”中获取用于根上下文,“/WEB-INF/test-servlet.xml”用于具有命名空间的上下文

“test-servlet”(类似于带有 servlet 名称“test”的 DispatcherServlet 实例)。

可以通过“contextConfigLocation”覆盖配置位置默认值 {@link org.springframework.web.context.ContextLoader} 和 servlet 的上下文参数 {@link org.springframework.web.servlet.FrameworkServlet} 的初始化参数。

配置位置可以表示具体的文件,如“/WEB-INF/context.xml”或 Ant 风格的模式,像“/WEB-INF/*-context.xml”(见{@link org.springframework.util.PathMatcher}模式详细信息的 javadoc。

注意:在多个配置位置的情况下,后定义的bean将覆盖先前加载的文件中定义的那些。这可以用来通过额外的 XML 文件故意覆盖某些 bean 定义。对于以不同 bean 定义格式读取的 WebApplicationContext,创建一个类似的 {@link AbstractRefreshableWebApplicationContext} 子类。这样的上下文实现可以指定为“contextClass”上下文参数用于 ContextLoader 或“contextClass” init-param 用于 FrameworkServlet。