Spring中的Context你真的懂了吗
前言
今天介绍一下大家常见的一个单词context应该怎么去理解,正确的理解它有助于我们学习spring以及计算机系统中的其他知识。
1.context是什么
我们经常在编程中见到context这个单词,当然每个人有每个人的理解,它被理解为:上下文、容器等等。我想说的是,context理解为上下文最为合适。为什么呢?我以一个在计算机系统的例子来解释一下。
在计算机系统中,进程执行时有进程上下文,如果进程在执行的过程中遇到了中断,CPU会从用户态切换为内核态(当然这个过程用户进程是感知不到的,由硬件来实现的),此时进程处于的进程上下文会被切换到中断上下文中,从而可以根据中断号去执行相应的中断程序。
通过上面这个例子我们可以发现,进程在执行程序(不管是用户程序,还是内核中的中断程序)时,都会依赖一个上下文,这个上下文由多种数据结构组成,可以提供我们运行时需要的一些数据和保存运行时的一些数据。那其实context就可以理解对一个程序运行时所需要的一些数据结构的抽象表达呗。
抽象是个好东西,可以更方便的表达一些东西,更好的设计系统,但大家要想进步也不能停留在抽象层面,要去探索它的真正含义,真正对应的实体。有时间和大家聊一聊抽象应该怎么去理解。
2.springcontext是什么
回到spring中,spring的ioc容器也是程序呀,那它的执行也肯定需要依赖一个上下文。所以大家应该理解springcontext的意思了吧。那springcontext既然是spring的上下文,按照我们上面的说法上下文会对应数据结构,那springcontext的数据结构是什么呢?换句话说,springcontext究竟包括什么?接下来我就把这个抽象的概念给大家对应到实打实的数据结构上。
3.springcontext包括什么
主要包括:
- DefaultListableBeanFactory
这就是大家常说的ioc容器,它里面有很多map、list。spring帮我们创建的singleton类型的bean就存放在其中一个map中。我们定义的监听器(ApplicationListener)也被放到一个Set集合中。 - BeanDefinitionRegistry
把一个BeanDefinition放到beanDefinitionMap。 - AnnotatedBeanDefinitionReader
针对AnnotationConfigApplicationContext而言。一个BeanDefinition读取器。 - 扩展点集合
存放spring扩展点(主要是BeanFactoryPostProcessor、BeanPostProcessor)接口的list集合。
4.springcontext的生命周期
下面大家可以结合代码这段代码去理解springcontext的生命周期。
publicstaticvoidmain(String[]args){ //初始化和启动 AnnotationConfigApplicationContextacaContext=newAnnotationConfigApplicationContext(AppConfig.class); //运行 acaContext.getBean(ServiceA.class); //关闭/销毁 acaContext.close(); }
4.1初始化和启动
我们平时常说的spring启动其实就是调用AbstractApplicationContext#refresh完成springcontext的初始化和启动过程。springcontext初始化从开始到最后结束以及启动,这整个过程都在refresh这个方法中。refresh方法刚开始做的是一些springcontext的准备工作,也就是springcontext的初始化,比如:创建BeanFactory、注册BeanFactoryPostProcessor等,只有等这些准备工作做好以后才去开始springcontext的启动。
与现实生活联系一下,你可以把初始化理解为准备原料(对应到编程中就是创建好一些数据结构,并为这些数据结构填充点数据进去),等准备了你才能去真正造玩偶、造东西呀(对应到编程中就是执行算法)。在编程中数据结构与算法是分不开的也是这个道理呀,它们相互依赖并没有严格的界限划分。
4.2运行
springcontext启动后可以提供它的服务的这段时间。
4.3关闭/销毁
不需要用springcontext,关闭它时,其实对应到代码上就是acaContext.close();
5.总结
最近又去研究了一遍spring源码以及一些操作系统知识的复习,突然有感而发,写下这篇文章。如果大家想学习spring源码和操作系统的话,可以下面留言,我以后会出一系列相关的文章。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。