Spring Context 你真的懂了吗

今天介绍一下你们常见的一个单词 context 应该怎么去理解,正确的理解它有助于咱们学习 spring 以及计算机系统中的其余知识。算法

1. context 是什么

咱们常常在编程中见到 context 这个单词,固然每一个人有每一个人的理解,它被理解为:上下文、容器等等。我想说的是,context 理解为上下文最为合适。为何呢?我以一个在计算机系统的例子来解释一下。spring

在计算机系统中,进程执行时有进程上下文,若是进程在执行的过程当中遇到了中断,CPU 会从用户态切换为内核态(固然这个过程用户进程是感知不到的,由硬件来实现的),此时进程处于的进程上下文会被切换到中断上下文中,从而能够根据中断号去执行相应的中断程序。编程

经过上面这个例子咱们能够发现,进程在执行程序(无论是用户程序,仍是内核中的中断程序)时,都会依赖一个上下文,这个上下文由多种数据结构组成,能够提供咱们运行时须要的一些数据和保存运行时的一些数据。那其实 context 就能够理解对一个程序运行时所须要的一些数据结构的抽象表达呗。后端

抽象是个好东西,能够更方便的表达一些东西,更好的设计系统,但你们要想进步也不能停留在抽象层面,要去探索它的真正含义,真正对应的实体。有时间和你们聊一聊抽象应该怎么去理解。微信

2. spring context 是什么

回到 spring 中,spring 的 ioc 容器也是程序呀,那它的执行也确定须要依赖一个上下文。因此你们应该理解 spring context 的意思了吧。那 spring context 既然是 spring 的上下文,按照咱们上面的说法上下文会对应数据结构,那 spring context 的数据结构是什么呢?换句话说,spring context 究竟包括什么?接下来我就把这个抽象的概念给你们对应到实打实的数据结构上。数据结构

3. spring context 包括什么

主要包括:学习

  • DefaultListableBeanFactory
    这就是你们常说的 ioc 容器,它里面有不少 map、list。spring 帮咱们建立的 singleton 类型的 bean 就存放在其中一个 map 中。咱们定义的监听器(ApplicationListener)也被放到一个 Set 集合中。
  • BeanDefinitionRegistry
    把一个 BeanDefinition 放到 beanDefinitionMap。
  • AnnotatedBeanDefinitionReader
    针对 AnnotationConfigApplicationContext 而言。一个 BeanDefinition 读取器。
  • 扩展点集合
    存放 spring 扩展点(主要是 BeanFactoryPostProcessor、BeanPostProcessor)接口的 list 集合。

4. spring context 的生命周期

下面你们能够结合代码这段代码去理解 spring context 的生命周期。spa

public static void main(String[] args) {
     // 初始化和启动
     AnnotationConfigApplicationContext acaContext = new AnnotationConfigApplicationContext(AppConfig.class);
     // 运行
     acaContext.getBean(ServiceA.class);
     // 关闭/销毁
     acaContext.close();
 }复制代码

4.1 初始化和启动

咱们平时常说的spring 启动其实就是调用 AbstractApplicationContext#refresh 完成 spring context 的初始化和启动过程。spring context 初始化从开始到最后结束以及启动,这整个过程都在 refresh 这个方法中。refresh 方法刚开始作的是一些 spring context 的准备工做,也就是 spring context 的初始化,好比:建立 BeanFactory、注册 BeanFactoryPostProcessor 等,只有等这些准备工做作好之后才去开始 spring context 的启动。操作系统

与现实生活联系一下,你能够把初始化理解为准备原料(对应到编程中就是建立好一些数据结构,并为这些数据结构填充点数据进去),等准备了你才能去真正造玩偶、造东西呀(对应到编程中就是执行算法)。在编程中数据结构与算法是分不开的也是这个道理呀,它们相互依赖并无严格的界限划分。设计

4.2 运行

spring context 启动后能够提供它的服务的这段时间。

4.3 关闭/销毁

不须要用 spring context ,关闭它时,其实对应到代码上就是 acaContext.close();

5. 总结

最近又去研究了一遍 spring 源码以及一些操做系统知识的复习,忽然有感而发,写下这篇文章。若是你们想学习 spring 源码和操做系统的话,能够下面留言,我之后会出一系列相关的文章。搜索微信公众号:Java知其因此然,可免费领取某课、Java 后端面经等资源,还有统一环境(教你怎么配置一套开发环境)视频领取。

相关文章
相关标签/搜索