Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析
Spring之AnnotationConfigApplicationContext源码分析
- 源码分析
源码分析
以上一篇文章《Spring之Bean的生命周期》的代码进行源码分析
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig02.class);
LifeCycleBean lifeCycleBean = applicationContext.getBean("lifeCycleBean", LifeCycleBean.class);
System.out.println("-----------------------------------");
System.out.println("LifeCycleBean " + lifeCycleBean);
System.out.println("-----------------------------------");
applicationContext.close();
new AnnotationConfigApplicationContext(SpringConfig02.class)
AnnotationConfigApplicationContext.java

AbstractApplicationContext.java
@Override
public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.// 容器刷新前的准备工作,例如对系统属性、环境变量进行准备及验证prepareRefresh();// Tell the subclass to refresh the internal bean factory.// 初始化BeanFactoryConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// Prepare the bean factory for use in this context.// 对BeanFactory进行属性填充及功能填充,例如添加某些BeanPostProcessor以实现某些功能(ApplicationContextAwareProcessor)prepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses.// 空方法,用于子类实现扩展功能postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.// 执行BeanFactoryPostProcessor,例如ConfigurationClassPostProcessor、EventListenerMethodProcessor以及某些自定义的BeanFactoryPostProcessor// ConfigurationClassPostProcessor用于处理配置类,会将配置类中需要注册的Bean对象的元数据解析并存入beanDefinitionMap集合中invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.// 注册BeanPostProcessor,例如AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor以及某些自定义的BeanPostProcessorregisterBeanPostProcessors(beanFactory);// Initialize message source for this context.// 初始化消息资源,国际化处理initMessageSource();// Initialize event multicaster for this context.// 初始化消息多播器initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.// 空方法,用于子类实现扩展功能onRefresh();// Check for listener beans and register them.// 注册所有的ApplicationListener到消息多播器registerListeners();// Instantiate all remaining (non-lazy-init) singletons.// 实例化、初始化剩下的非懒加载的单例对象finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.// 完成刷新动作,启动LifecycleProcessor,发布ContextRefreshedEvent事件finishRefresh();}catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex);}// Destroy already created singletons to avoid dangling resources.// 销毁已创建的单例对象destroyBeans();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}finally {// Reset common introspection caches in Spring's core, since we// might not ever need metadata for singleton beans anymore...resetCommonCaches();}}
}
BeanFactory中两个重要的对象
DefaultListableBeanFactory.java
/** Map of bean definition objects, keyed by bean name. */
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
DefaultSingletonBeanRegistry.java
/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
Debug源码分析


register(componentClasses):注册指定的配置类SpringConfig02到beanDefinitionMap集合中




invokeBeanFactoryPostProcessors(beanFactory):创建BeanFactoryPostProcessor接口相关实现类的实例对象并存入singletonObjects集合中;执行BeanFactoryPostProcessor接口相关实现类的方法,通过ConfigurationClassPostProcessor处理配置类中需要注册的bean对象,并将bean对象注册到beanDefinitionMap集合中。

registerBeanPostProcessors(beanFactory):注册BeanPostProcessor接口相关实现类,创建BeanPostProcessor接口相关实现类的实例对象并存入singletonObjects集合中


finishBeanFactoryInitialization(beanFactory):实例化、初始化剩下的非懒加载的单例对象并存入singletonObjects集合中

beanFactory.preInstantiateSingletons():提前加载单例对象
相关文章:
Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析
Spring之AnnotationConfigApplicationContext源码分析 源码分析 源码分析 以上一篇文章《Spring之Bean的生命周期》的代码进行源码分析 AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(SpringConfig02.class); LifeCycleBe…...
opencv直方图与模板匹配
import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() 直方图 cv2.calcHist(images,channels,mask,histSize,ran…...
Apache Doris 入门教程31:计算节点
需求场景 目前Doris是一个典型Share-Nothing的架构, 通过绑定数据和计算资源在同一个节点获得非常好的性能表现. 但随着Doris计算引擎性能持续提高, 越来越多的用户也开始选择使用Doris直接查询数据湖数据. 这类场景是一种Share-Disk场景, 数据往往存储在远端的HDFS/S3上, 计…...
Nacos和GateWay路由转发NotFoundException: 503 SERVICE_UNAVAILABLE “Unable to find
问题再现: 2023-08-15 16:51:16,151 DEBUG [reactor-http-nio-2][CompositeLog.java:147] - [dc73b32c-1] Encoding [{timestampTue Aug 15 16:51:16 CST 2023, path/content/course/list, status503, errorService Unavai (truncated)...] 2023-08-15 16:51:16,17…...
2021年9月全国计算机等级考试真题(二级C语言)
2021年9月全国计算机等级考试真题(二级C语言) 第1题 下列叙述中正确的是( )。 A. 算法的复杂度是指算法所处理的数据量 B. 算法的复杂度是指算法程序中指令的数量 C. 算法的复杂度是指算法控制结构的复杂程度 D. 算法的复杂度包…...
串口通讯
USART是全双工同步通讯 在同步通信中,数据信号所传输的内容绝大多数属于有效数据,而异步通信中包含了各种帧的标识符,所以同步通讯的效率更高。但是同步通信对时钟要求苛刻,允许的误差小。而异步通信则允许双方的误差较大 比特率…...
自动拉取 GitHub 仓库更新的脚本
更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 由于将 HAUE-CS-WIKI 部署到了我自己的服务器上作为国内镜像站,每次在源站更新后都需要手动拉取镜像站的更新实在是太麻烦了,因此产生了编写该脚本的需求( 读者可根据该…...
如何获得Android 14复活节彩蛋
每个新的安卓版本都有隐藏复活节彩蛋的悠久传统,可以追溯到以前,每个版本都以某种甜食命名。安卓14也不例外,但这一次的主题都是围绕太空构建的——还有一个复活节彩蛋。 安卓14复活节彩蛋实际上是一款很酷的小迷你游戏,你可以乘…...
国产32位单片机XL32F001,带1 路 12bit ADC,I2C、SPI、USART 等外设
XL32F001 系列单片机采用高性能的 32 位 ARM Cortex-M0内核,宽电压工作范围的 MCU。嵌入 24KbytesFlash 和 3Kbytes SRAM 存储器,最高工作频率 24MHz。包含多种不同封装类型多款产品。芯片集成 I2C、SPI、USART 等通讯外设,1 路 12bit ADC&am…...
typescript基础之null和undefined
TypeScript是一种基于JavaScript的编程语言,它支持静态类型检查和面向对象的特性。TypeScript中的null和undefined是两种基本类型,它们分别表示空值或未定义的值。在本文中,我将介绍TypeScript中null和undefined的含义、区别、检查方法和使用…...
php_mb_strlen指定扩展
1 中文在utf-字符集下占3个字节,所以计算出来长度为9。 2 可以引入php多字节字符的扩展,默认是没有的,需要自己配置这个函数 3 找到php.ini文件,去掉;extension mbstring的注释,接着重启apache服务 可以看到准确输出的中文的长度…...
利用OpenCV光流算法实现视频特征点跟踪
光流简介 光流(optical flow)是运动物体在观察成像平面上的像素运动的瞬时速度。光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。…...
探索无限创造力的星辰大道,画出想象的浩瀚宇宙!-turtle
介绍 视频教程地址在此:https://www.bilibili.com/video/BV1Pm4y1H7Tb/ 大家好,欢迎来到本视频!今天,我们将一同探索Python编程世界中的一个有趣而创意的库——Turtle库。无需专业绘画技能,你就可以轻松地用代码绘制…...
企业数字化转型大数据湖一体化平台项目建设方案PPT
导读:原文《企业数字化转型大数据湖一体化平台项目建设方案PPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 喜欢文章,您可以点赞评论转发…...
【3Ds Max】车削命令的简单使用(以制作花瓶为例)
简介 在3ds Max中,"车削"(Lathe)是一种建模命令,用于创建围绕轴线旋转的几何形状。通过车削命令,您可以将一个闭合的平面或曲线几何形状旋转,从而生成一个立体对象。这种方法常用于创建圆柱体、…...
Python 3 使用HBase 总结
HBase 简介和安装 请参考文章:HBase 一文读懂 Python3 HBase API HBase 前期准备 1 安装happybase库操作hbase 安装该库 pip install happybase2 确保 Hadoop 和 Zookeeper 可用并开启 确保Hadoop 正常运行 确保Zookeeper 正常运行3 开启HBase thrift服务 使用命…...
Maven方式构建SpringBoot项目
目录 1、创建maven项目 2、添加springboot相关依赖 3、配置启动端口 4、修改APP文件 5、配置controller 6、启动应用 1、创建maven项目 项目如下: 2、添加springboot相关依赖 <parent><groupId>org.springframework.boot</groupId><arti…...
不花一分钱,利用免费电脑软件将视频MV变成歌曲音频MP3
教程 1.点击下载电脑软件下载地址,点击下载,安装。(没有利益关系,没有打广告,只是单纯教学) 2.安装完成后,点击格式工厂 3.然后如图所示依次,点击【音频】->【-MP3】 3.然后点击…...
运营知识之用户运营(一)触达用户的几种方式
运营知识之用户运营(一)触达用户的几种方式 APP推送短信(DeepLink/Deferred DeepLink):短信拉起app电子邮件 EDM电话/外呼(人工、AI)电话外呼加短信(操作步骤短链)微信生…...
cocos creator pageView 循环展示 广告牌功能
在使用 creator pageView 滑动到最大或者最小为止的时候 滑动不了没法流畅的运行到最开始或者最后那个界面 循环展示 1.策划大人有需要就是要循环流畅的展示 解决方案: 做预制件的时候 最第一个界面之前 做一个最后的界面放到最前边去 比如 1,2,3,4,5,6,7,8 修改成 8,1…...
记一次攻防演练复盘(蓝队)
事件:某省大数据局主导的一次攻防演练中午时段遭受大量攻击。 告警信息(TOP 5):[疑似目录穿越攻击URI] [漏洞攻击: Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)] [web路径遍历漏洞攻击-Linux环境] [XSS跨站脚本攻击U…...
ESP32-CAM远程控制实战:SunFounder AI Camera库深度解析
1. SunFounder AI Camera 库深度解析:面向嵌入式工程师的 ESP32-CAM 远程控制实践指南SunFounder AI Camera 并非传统意义上的纯图像处理模块,而是一套完整的“端-云-APP”协同控制系统。其核心价值在于将 ESP32-CAM 这一低成本、高集成度的 AI 视觉平台…...
BURSTER 8645-5005 扭矩传感器
BURSTER 8645-5005(德国波斯特)是一款非接触式、磁致伸缩原理、高精度动态旋转扭矩传感器,量程 5 N・m,内置放大器,专为连续旋转工况下的动态扭矩测量设计一、型号与量程型号:BURSTER 8645-5005系列&#x…...
ARM开发板与虚拟机Ubuntu桥接模式下的网络互通实战
1. 为什么需要桥接模式? 很多刚接触嵌入式开发的朋友都会遇到一个头疼的问题:ARM开发板和虚拟机里的Ubuntu系统死活ping不通。这就像两个人在同一个房间里却互相听不见对方说话,急死人。我当年第一次做嵌入式项目时,整整折腾了两天…...
阿里云RocketMQ LiteTopic:破解高并发智能语音交互消息链路难题
【导语:随着AI Agent从文本交互走向语音交互,高并发场景下消息链路瓶颈凸显。阿里云基于RocketMQ LiteTopic构建实时语音消息链路架构,解决传统架构难题,提升业务价值。】高并发语音交互的技术瓶颈当AI Agent语音交互进入高并发场…...
【昇腾】Deepseek双机:高效网络配置与故障排查指南
1. 昇腾AI双机组网基础架构 第一次接触昇腾AI服务器双机部署时,最让我头疼的就是网络架构设计。不同于普通服务器的千兆网卡互联,昇腾NPU的200G/400G高速网络接口需要特殊的组网方案。这里我结合自己踩过的坑,给大家拆解两种最常见的组网模式…...
3步掌握BilibiliDown:从视频下载到音频提取的完整攻略
3步掌握BilibiliDown:从视频下载到音频提取的完整攻略 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/b…...
OpenClaw备份与迁移:Qwen3.5-4B-Claude项目环境快速转移
OpenClaw备份与迁移:Qwen3.5-4B-Claude项目环境快速转移 1. 为什么需要备份与迁移方案 上周我的主力开发机突然硬盘故障,导致所有OpenClaw配置和技能丢失。在经历了8小时的手动重建后,我意识到必须建立一套可靠的备份迁移流程。特别是当我们…...
别再让LVGL卡顿了!手把手教你用思澈SDK的menuconfig优化framebuffer配置,帧率翻倍
别再让LVGL卡顿了!手把手教你用思澈SDK的menuconfig优化framebuffer配置,帧率翻倍 嵌入式UI开发中,LVGL的流畅度直接影响用户体验。许多开发者在使用思澈SDK时,常遇到界面卡顿、帧率低的问题。本文将深入分析framebuffer配置对性能…...
Java 使用国密算法实现数据加密传输
本文是混合加密:前端 SM2 SM4,后端 Spring Boot Hutool 解密的完整示例。 方案的逻辑是: 前端随机生成一个 SM4 key 用 SM4 加密整个业务 JSON 用后端提供的 SM2 公钥 加密这个 SM4 key 后端先用 SM2 私钥 解出 SM4 key 再用 SM4 解出…...
