Java研究院 Java研究院

人非生而知之者,知之,而后知不知。

目录
Spring IOC 原理详解(二)
/    

Spring IOC 原理详解(二)

IOC容器工作机制

对于一个web应用,部署在 web 容器中。web 容器提供其一个全局的上下文环境,这个上下文就是 ServletContext,其为后面的 Spring IOC 容器提供宿主环境。

在 web.xml 中会提供有 ContextLoaderListener(或 ContextLoaderServlet)。
在 web 容器启动时,会触发容器初始化事件,此时 ContextLoaderListener 会监听到这个事件,其 ContextInitialized 方法会被调用.
在这个方法中,Spring 会初始化一个启动上下文,这个上下文被称为 根上下文,即 WebApplicationContext ,这是一个接口类。
确切的说,其实际的实现类是 XmlWebApplicationContext。
这个就是 Spring 的 IOC 容器,其对应的 Bean 定义的配置由 web.xml 中的 context-param 标签指定。
在这个 IOC 容器初始化完毕后,Spring 容器以 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 为属性Key,将其存储到 ServletContext 中,便于获取。

ContextLoaderListener 监听器初始化完毕后,开始初始化 web.xml 中配置的 Servlet,这个 Servlet 可以配置多个。
以最常见的 DispatcherServlet 为例(Spring MVC),这个 Servlet 实际上是一个标准的前端控制器,用以转发、匹配、处理每个 Servlet 请求。
DispatcherServlet 上下文在初始化的时候会建立自己的IOC上下文容器,用以持有 Spring MVC 相关的 Bean,这个 Servlet 自己持有的上下文默认实现类也是 XmlWebApplicationContext。
在建立 DispatcherServlet 自己的 IOC 上下文时,会利用 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 先从
ServletContext 中获取之前的根上下文(即 WebApplicationContext)作为自己上下文的 parent 上下文(即上述初始化的 XmlWebApplicationContext 作为自己的父容器)。
有了这个 parent 上下文之后,再初始化自己持有的上下文(这个 DispatcherServlet 初始化自己上下文的工作在其 InitStrategies 方法中可以看到,大概的工作就是初始化处理器映射、视图解析等)。
初始化完毕后,Spring 以与 Servlet 的名字相关(此处不是简单的以 Servlet 名为 Key,而是通过一些转换)的属性为属性 Key,也将其存到 ServletContext 中,以便后续使用。
这样每个 Servlet 就持有自己的上下文,即拥有自己独立的 Bean 空间,同时各个 Servlet 共享相同的 Bean,即根上下文定义的那些 Bean。

容器启动原理

Spring 应用的 IOC 容器通过 tomcat 的 Servlet 或 Listener 监听启动加载;Spring MVC 的容器由 DispatchServlet 作为入口加载;Spring 容器是 Spring MVC 容器的父容器

容器加载Bean原理

BeanDefinitionReader 读取 Resource 所指向的配置文件资源,然后解析配置文件。配置文件中每一个解析成一个 BeanDefinition 对象,并保存到 BeanDefinitionRegistry 中;

容器扫描 BeanDefinitionRegistry中的 BeanDefinition;调用 InstantiationStrategy 进行 Bean 实例化的工作;使用 BeanWrapper 完成 Bean 属性的设置工作;

单例Bean缓存池:Spring 在 DefaultSingletonBeanRegistry 类中提供了一个用于缓存单实例 Bean 的缓存器,它是一个用 HashMap 实现的缓存器,单实例的 Bean 以 beanName 为键保存在这个 HashMap 中。


才疏学浅,难免有坑,有坑也不填
标题:Spring IOC 原理详解(二)
地址:https://studying.icu/articles/2021/09/18/1631948194268.html