Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Context 你真的懂了吗

Spring Context 你真的懂了吗

作者头像
帅飞
发布于 2019-11-06 09:48:23
发布于 2019-11-06 09:48:23
1K00
代码可运行
举报
文章被收录于专栏:Java知其所以然Java知其所以然
运行总次数:0
代码可运行

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

1. context 是什么

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

在计算机系统中,进程执行时有进程上下文,如果进程在执行的过程中遇到了中断,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 的生命周期。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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 源码和操作系统的话,可以下面留言,我以后会出一系列相关的文章。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java知其所以然 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
逐行阅读Spring5.X源码(一) BeanDefinition,起点
本篇博客你讲学到: 1. 如何理解BeanDefinition 2. 准备环境 3. BeanDefinition接口讲解 4. BeanDefinition的类继承关系 5. IOC的引出 6. BeanFactory工厂的引出 7. 后置处理器的引出 8. spring扩展性初探
源码之路
2020/09/03
1.4K0
Spring源码系列:核心概念解析
本文旨在为读者解析Spring源码中的关键类,以便读者在深入阅读源码时,能够了解关键类的作用和用途。在阅读Spring源码时,经常会遇到一些不熟悉的概念,了解关键类的作用可以帮助读者更好地理解这些概念。
努力的小雨
2024/04/28
1210
关于Spring体系的各种启动流程
不管是哪种系列的spring(springframework、springmvc、springboot、springcloud),Spring的启动过程主要可以分为两部分:
tunsuy
2022/10/27
1.3K0
逐行阅读Spring5.X源码(番外篇)BeanDefinition到底有多重要
如果想系统的学习spring源码那么第一个需要搞明白的知识便是spring当中的BeanDefinition——spring bean的建模对象;
源码之路
2020/09/04
9010
逐行阅读Spring5.X源码(番外篇)BeanDefinition到底有多重要
Spring容器启动核心方法refresh()
AbstractApplicationContext 是所有 Spring上下文类的抽象父类。
用户7741497
2022/03/24
9440
《Spring 手撸专栏》第 7 章:所向披靡,实现应用上下文,自动识别、资源加载、扩展机制
依照项目落地经验来看,我们在承接紧急的产品需求时候,通常会选择在原有同类项目中进行扩展,如果没有相关类型项目的储备,也可能会选择临时搭建出一个工程来实现产品的需求。但这个时候就会遇到非常现实的问题,选择完整的设计和开发就可能满足不了上线时间,临时拼凑式的完成需求又可能不具备上线后响应产品的临时调整。
小傅哥
2021/06/25
3610
《Spring 手撸专栏》第 7 章:所向披靡,实现应用上下文,自动识别、资源加载、扩展机制
Spring 应用上下文探秘:生命周期解析与最佳实践
在 Spring 的世界中,每个 bean 都有其自己的生命周期,就像每个角色都有自己的故事一样。今天,我们将成为 Spring 的探险者,深入探索应用上下文的生命周期,解开其中的神秘面纱。或许,你将在这段旅程中发现一些你从未见过的 Spring 魔法。
一只牛博
2025/05/30
920
Spring 应用上下文探秘:生命周期解析与最佳实践
Spring框架为何这么叼?
Spring作为一个优秀的企业级应用框架,提供了企业开发过程中大多数基础功能的支持,如:事务,切面,web支持,数据库支持,ORM,OXM等等等等。但它不仅仅只是提供了这些基础功能,而是在提供这些基础功能的同时,给开发人员留下了许许多多的功能扩展点,使用者可以利用这些扩展点随意加入自己想要的其他功能,这也是Spring开闭原则的精髓。比如:常见的一些企业中间件例如:Dubbo,JSF,MyBatis,又或者是近些年比较流行的微服务框架SpringCloud等,其功能都是在Spring提供的扩展点之上扩展出来的新功能。那么Spring中经常使用到的扩展点有哪些呢?
程序员小猿
2021/01/19
2800
Spring MVC系列-(7) IOC初始化流程
IoC容器的初始化就是含有BeanDefinition信息的Resource的定位、载入、解析、注册四个过程,最终我们配置的bean,以beanDefinition的数据结构存在于IoC容器即内存中。这里并不涉及bean的依赖注入,只是bean定义的载入。但有例外,在使用Ioc容器时有一个预实例化的配置,即bean定义中的设置了lazyinit属性,那么这个bean在Ioc容器初始化时就预先加载,不需要等到Ioc整个初始化后,第一次getBean时才会触发。其中refresh()启动对Ioc容器的初始化。
码老思
2023/10/19
5850
Spring MVC系列-(7) IOC初始化流程
Spring 框架核心原理
尽管希腊哲学家赫拉克利特(Heraclitus)并不作为一名软件开发人员而闻名,但他似乎深谙此道。他的一句话经常被引用:“唯一不变的就是变化”,这句话抓住了软件开发的真谛。
一个会写诗的程序员
2020/03/20
1.1K0
Spring 框架核心原理
Spring IoC 源码分析 (基于注解) 一
IoC 全称为 Inversion of Control,翻译为 “控制反转”,它还有一个别名为 DI(Dependency Injection),即依赖注入。
周同学
2019/08/29
1.2K0
Spring  IoC 源码分析 (基于注解) 一
Spring拓展点:BeanFactoryPostProcessor及其子接口
BeanFactoryPostProcessor是一个函数式接口,里面只有一个方法:
Coder小黑
2019/12/15
1.1K0
SpringBoot 系列-启动过程分析
小伙伴们,大家好!昨天因为操作失误,所以没有更新成功。在这个澳门回归20周年的今天,我继续更新SpringBoot 系列的第二篇,上次文章还没看的小伙伴,可以点击查看:《SpringBoot 系列-FatJar 启动原理》。
安徽开发者圈
2020/03/02
8440
【原创】2w 字搞懂 Spring Bean 的一生
当我们不用Spring进行开发时,我们需要在代码中设置对象的依赖关系。当我们用了Spring之后,由Spring来管理这种依赖关系,当我们想使用对象时,直接从Spring容器中获取即可
Java识堂
2021/06/01
7840
【原创】2w 字搞懂 Spring Bean 的一生
Spring4.3.x源码阅读-IOC
作为Java程序员,一定会和Spring打交道,最初学习Spring的时候,也是跟着视频,按照老师的操作,一步步学着如何使用Spring,慢慢的,了解到一些重点概念,比如IOC,AOP等,当初学习的时候就觉得Spring好神奇,好厉害,就越发的想要了解其背后的原理,下文会围绕Spring的核心概念以及工作中会接触到的知识点,来阅读Spring的源码,揭开Spring的神秘面纱。
小刘Learning
2024/03/16
2100
Spring4.3.x源码阅读-IOC
Spring5源码 - 04 invokeBeanFactoryPostProcessors 源码解读_1
接上文 Spring5源码 - 03 普通对象对应的BeanDefinition是如何存入DefaultListableBeanFactory#beanDefinitionMap 源码分析
小小工匠
2021/08/17
2740
Spring 核心概念
在前一篇我们了解了 Spring IOC, Spring AOP 的强大,以及对我们编程范式,编程基础的影响。接下来我们一起来聊一下 Spring 基础概念。对于基础概念而言基本上都是属于那种字典类型的会有一定的枯燥程度,大佬文末见。
没有故事的陈师傅
2023/05/01
2710
Spring 核心概念
长文预警!Spring源码之IoC容器的基本实现
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
用户5546570
2020/11/12
3170
长文预警!Spring源码之IoC容器的基本实现
深入解析Spring框架的ApplicationContext体系结构
ApplicationContext体系结构是Spring框架的关键组成部分,它提供了一个容器,用于管理和配置应用程序中的对象(称为Bean)。这个容器在应用程序生命周期中加载、配置和管理Bean,支持依赖注入和面向切面编程等功能,从而实现了松耦合、可维护和可扩展的Java应用程序。ApplicationContext还提供了对国际化、事件传播和资源处理等特性的支持,使Spring成为一个强大的企业级应用程序开发框架。
杨不易呀
2023/09/26
6890
深入解析Spring框架的ApplicationContext体系结构
面试系列-spring-ioc原理
低级容器BeanFactory可以理解为就是个HashMap,Key是BeanName,Value是Bean实例,通常只提供注册(put),获取(get)这两个功能;是IOC容器的基础接口,所有的容器都是从它这里继承实现而来,BeanFactory作为SpringIOC容器,管理着Bean的生命周期,控制着Bean的依赖注入;
用户4283147
2022/10/27
3610
面试系列-spring-ioc原理
相关推荐
逐行阅读Spring5.X源码(一) BeanDefinition,起点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验