项目开放中, spring框架的启动过程是什么样的呢? 以下就简单的概述一下
首先了解一些基本的概念,
1. BeanFactory : spring构建过程中的核心接口, 顶级接口, 主要提供根据beanName获取Bean实例 getBean(String beanName) 方法, 注意: 这个获取Bean实例存在"第一次惩罚"的情况, 即懒加载的问题
2. ApplicationContext : 继承自BeanFactory 接口, BeanFactory 主要面对的是spring框架, 而ApplicationContext接口面向实际应用, 可以在此基础上记性相应的扩展, 此接口初始化的过程中需要实例化所有单实例的Bean
3. WebApplicationContext : Spring容器的上下文对象, 专为WEB应用准备的, 继承自ApplicationContext接口,
4. ServletContext : WEB容器的上下文对象
了解以上概念之后, 可以大概了解一下Spring的启动过程了, 其实Spring的启动过程 就是为了加载以上对象的过程, 顶多就是在以上接口上面有些节点, 然后附加一些细节的东西,(父子容器, 国际化等); Spring启动过程需要将Spring容器上下文跟WEB容器的上下文对象进行融合, 因为WebApplicationContext 在启动的过程中需要依赖ServletContext对象, 这也就是我们经常在开发中的Web.xml中进行配置ContextLoadListener监视器, 用来启动WEB容器
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
WebApplicationContext 中维护了一个常量ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, 在启动的过程中,
WebApplicationContext 实例将以此为键存放在ServletContext的属性列表中, 我们可以通过以下语句从WEB容器中获取到WebApplicationContext 实例对象
WebApplicationContext wac= WebApplicationContext) servletContext.getAttaribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
其实这也就是Spring为我们提供的WebApplicationContextUtil.getApplicationContext(ServletContext servletContex)工具类的内部实现, 我们只需要调用这个工具类即可
这样就把Spring上下文对象和Web容器上下融合在一起了