当前位置: 首页 > article >正文

Spring容器启动流程解析

lookup注解源码分析核心功能概述lookup注解用于解决原型(prototype)作用域Bean在单例Bean中的依赖注入问题每次调用带有lookup注解的方法时都会从Spring容器中获取一个新的Bean实例。实现原理Spring在创建Bean的过程中会检查方法是否标注Lookup。若存在该注解则生成一个代理对象该代理对象在执行Lookup标注的方法时会通过BeanFactory.getBean()获取新的实例。实际上是利用CGLIB动态代理或JDK动态代理生成代理类并重写方法以达到每次获取新实例的目的。与AOP的区别lookup注解的代理机制与AOP不同它不涉及切面逻辑仅用于控制Bean的获取方式。Spring启动流程概述Spring容器创建阶段创建默认的DefaultListableBeanFactory作为Bean工厂。创建BeanDefinitionReader和ClassPathBeanDefinitionScanner用于读取和扫描Bean定义。注册一些基础BeanPostProcessor和BeanFactoryPostProcessor。refresh()方法详解refresh()方法是Spring启动的核心入口包含多个关键子步骤prepareRefresh()设置环境变量、验证必要属性。obtainFreshBeanFactory()创建或刷新BeanFactory。prepareBeanFactory()为BeanFactory设置类加载器、表达式解析器、类型转换器等。postProcessBeanFactory()子类可扩展的钩子方法。invokeBeanFactoryPostProcessors()调用所有BeanFactoryPostProcessor对BeanFactory进行定制。registerBeanPostProcessors()注册BeanPostProcessor。initMessageSource()初始化国际化消息资源。initApplicationEventMulticaster()初始化事件广播器。onRefresh()模板方法供子类扩展。registerListeners()注册事件监听器。finishBeanFactoryInitialization()完成非懒加载单例Bean的初始化。finishRefresh()完成刷新发布上下文刷新事件。BeanFactory的创建与初始化BeanFactory的创建在AbstractApplicationContext的构造方法中调用父类构造器最终创建DefaultListableBeanFactory。DefaultListableBeanFactory继承自AbstractAutowireCapableBeanFactory并实现了ListableBeanFactory接口。BeanFactory的初始化内容设置比较器AnnotationAwareOrderComparator。设置泛型解析器GenericTypeResolver。设置依赖描述解析器AutowiredAnnotationBeanPostProcessor。注册ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor等核心后置处理器。BeanDefinition的注册与扫描注册主配置类使用BeanDefinitionReader将传入的主配置类封装为BeanDefinition并注册到BeanFactory中。扫描机制ClassPathBeanDefinitionScanner负责扫描指定包路径下的类将其转换为BeanDefinition。默认扫描带有Component、Service、Repository等注解的类。BeanFactoryPostProcessor的应用概念说明BeanFactoryPostProcessor是对BeanFactory的后置处理接口在BeanDefinition加载完成后、Bean实例化之前被调用。典型应用ConfigurationClassPostProcessor负责处理Configuration、ComponentScan、Import等注解。解析配置类触发组件扫描注册导入的Bean。调用时机在invokeBeanFactoryPostProcessors()方法中调用所有已注册的BeanFactoryPostProcessor。BeanPostProcessor的注册注册机制通过扫描发现用户自定义的BeanPostProcessor类。将其封装为BeanDefinition并注册到容器中。在registerBeanPostProcessors()方法中按顺序注册到BeanFactory的beanPostProcessors列表中。核心BeanPostProcessorAutowiredAnnotationBeanPostProcessor处理Autowired、Value等注解。CommonAnnotationBeanPostProcessor处理Resource、PostConstruct等注解。ApplicationListenerDetector检测并收集ApplicationListener类型的Bean。国际化支持初始化MessageSource的初始化查看容器中是否有自定义的MessageSourceBean。若没有则创建默认的DelegatingMessageSource。将其赋值给AbstractApplicationContext.messageSource属性。用途支持多语言消息的获取常用于国际化场景。事件广播器初始化ApplicationEventMulticaster的初始化查看容器中是否存在名为applicationEventMulticaster的Bean。若无则创建默认的SimpleApplicationEventMulticaster。注册到容器中并赋值给AbstractApplicationContext.applicationEventMulticaster。事件广播机制事件通过publishEvent()方法发布。广播器遍历所有监听器依次调用其onApplicationEvent()方法。支持同步/异步方式执行监听器逻辑。事件监听器的注册监听器来源用户自定义的ApplicationListenerBean。使用EventListener注解标注的方法。注册流程扫描出所有ApplicationListener类型的Bean。通过registerListeners()方法添加至事件广播器中。注解监听器适配使用EventListenerMethodProcessor处理EventListener注解。将方法封装为ApplicationListenerMethodAdapter并注册为监听器。单例Bean的实例化核心方法finishBeanFactoryInitialization()遍历所有非懒加载的单例Bean逐个进行实例化。按照依赖关系排序后创建确保依赖项先于目标Bean创建。实例化流程推断构造方法。实例化Bean。填充属性依赖注入。设置Aware接口回调。初始化前后的BeanPostProcessor处理。初始化方法调用如InitializingBean.afterPropertiesSet。注册销毁逻辑如DisposableBean.destroy。生命周期处理器与容器关闭事件SmartLifecycle接口的实现实现start()和stop()方法分别在容器启动和关闭时被调用。start()方法在finishRefresh()中调用。stop()方法在close()中调用。容器关闭事件发布调用doClose()方法发布ContextClosedEvent。清除缓存、关闭BeanFactory、销毁单例Bean。事件发布机制详解事件发布器结构SimpleApplicationEventMulticaster为核心实现类。内部维护一个ApplicationListener集合。事件监听器分类显式注册的ApplicationListener直接实现ApplicationListener接口由ApplicationListenerDetector识别并注册。EventListener注解方法通过EventListenerMethodProcessor适配为ApplicationListener。事件广播流程调用publishEvent()发布事件。将事件包装为ApplicationEvent。遍历所有监听器匹配事件类型后执行监听逻辑。支持线程池异步执行监听器。BeanFactoryPostProcessor与BeanPostProcessor对比BeanFactoryPostProcessor作用对象BeanFactory。应用时机BeanDefinition加载之后、Bean实例化之前。典型用途修改BeanDefinition元信息、注册新的BeanDefinition。BeanPostProcessor作用对象Bean实例。应用时机Bean实例化前后。典型用途依赖注入、属性填充、代理增强等。

相关文章:

Spring容器启动流程解析

lookup注解源码分析 核心功能概述lookup注解用于解决原型(prototype)作用域Bean在单例Bean中的依赖注入问题,每次调用带有lookup注解的方法时都会从Spring容器中获取一个新的Bean实例。实现原理Spring在创建Bean的过程中会检查方法是否标注Lookup。若存在该注解&…...

1985-2026.3人工智能专利数据库

参考《数量经济技术经济研究》乔刚(2025)关于人工智能专利识别与筛选的研究思路,本文依据国家知识产权局办公室印发的《关键数字技术专利分类体系(2023)》所界定的人工智能专利国际专利分类号(IPC&#xff…...

2001-2025年全国各省、市、县最低工资标准数据

数据简介 最低工资标准数据库是基于中国各省市人力资源和社会保障厅各年度所公布的最低工资标准文件整理而成的,反映我国各省市最低工资标准情况的专业数据库。 最低工资标准是劳动者在法定工作时间内提供正常劳动的前提下,企业用人单位依法支付给劳动…...

Spring Aop底层源码实现(一)

动态代理基础与实现 动态代理的作用在不修改目标类的前提下,为目标类的方法添加额外逻辑。两种代理方式:JDK动态代理与CGLIB代理JDK动态代理:基于接口,使用java.lang.reflect.Proxy。CGLIB代理:基于继承,适…...

智能排班系统在不同行业中的应用实践与价值分析

在现代企业管理体系中,排班管理是运营管理的重要组成部分。 无论是零售业、服务业还是制造业,科学合理的排班都是确保企业高效运营的基础。 然而,传统的手动排班方式由于效率低下、容易出错等问题,已经难以满足现代企业的管理需求…...

Qwen3智能字幕对齐系统Ubuntu20.04部署教程:从环境配置到一键启动

Qwen3智能字幕对齐系统Ubuntu20.04部署教程:从环境配置到一键启动 你是不是也遇到过这样的烦恼?下载了一部精彩的海外剧集或者技术分享视频,但字幕文件总是对不上口型,要么快几秒,要么慢半拍,手动调整起来…...

m3u8live.cn 在线M3U8播放器,免安装高效验流排错

在直播、点播、Web视频、在线教育、IPTV等流媒体业务常态化的今天,HLS(HTTP Live Streaming)协议已成为跨平台流媒体传输的主流选择,而M3U8作为HLS协议的核心载体,其地址有效性、播放稳定性的快速验证,成为…...

leetcode 1437. 是否所有 1 都至少相隔 k 个元素-耗时100

Problem: 1437. 是否所有 1 都至少相隔 k 个元素 耗时100%,统计连续0的个数,若存在11返回false, 若k0返回false,若前后是10则频次1,若前后是00则频次累加cnt,若前后是01则计算最小值 Code class Solution …...

Wan2.1视频生成新手必看:常见问题解答与最佳实践指南

Wan2.1视频生成新手必看:常见问题解答与最佳实践指南 你是不是也曾经对AI视频生成充满好奇,但一看到复杂的参数和不确定的结果就望而却步?或者已经尝试过Wan2.1,但生成的视频总是不尽如人意,不是画面模糊就是内容跑偏…...

移动端录音APP集成FRCRN SDK效果演示:前后录音质感飞跃

移动端录音APP集成FRCRN SDK效果演示:前后录音质感飞跃 最近在折腾一个安卓录音应用的原型,核心目标很简单:让手机录出来的声音,能干净得像在专业录音棚里处理过一样。我们都知道,手机录音最大的敌人就是环境噪音——…...

如何通过淘宝API接口根据商品ID获取商品评论

淘宝开放平台(Taobao Open Platform)为开发者提供了丰富的API接口,允许开发者通过商品ID获取商品评论数据。这在电商分析、用户反馈收集等场景中非常有用。本文将逐步介绍如何实现这一功能,包括注册平台、调用API、处理响应等。整…...

Nanbeige 4.1-3B快速上手:树莓派5+USB GPU部署轻量像素终端可行性实测

Nanbeige 4.1-3B快速上手:树莓派5USB GPU部署轻量像素终端可行性实测 1. 项目背景与目标 Nanbeige 4.1-3B是一款轻量级的大语言模型,其独特的像素游戏风格对话界面让AI交互变得生动有趣。本文将探索如何在树莓派5这样的小型设备上,通过外接…...

美食点评平台测试用例

本文档基于项目需求,针对基于SpringBoot搭建的美食点评平台编写了100个测试用例(包含功能、安全、性能等方面)。测试用例覆盖了用户登录、商户查询、优惠券秒杀、用户关注/点赞、收藏等核心功能模块,并运用等价类划分边界值分析、…...

AI绘画新选择:Z-Image-Turbo镜像一键部署与使用指南

AI绘画新选择:Z-Image-Turbo镜像一键部署与使用指南 1. 镜像核心优势与适用场景 Z-Image-Turbo是阿里达摩院推出的高性能文生图模型,基于DiT(Diffusion Transformer)架构开发。本镜像已预置完整的32.88GB模型权重文件&#xff0…...

【从零开始实现STM32步进电机驱动】(二)搭建硬件环境

1. 硬件准备全程自费无广,你买任何家的产品都可以,代码完全通用,只用到几个IO引脚而已。野火STM32F103C8T6核心板双USB野火小智DAP下载器模块42电机A4988电机驱动板A4988扩展板直流可调电压源洞洞板杜邦线2. 连接PA4→DIRPA5→STEPPA6→EN要点…...

ZigBee开发环境实战 -- IAR for 8051 10.30.1 安装与避坑指南

1. 为什么选择IAR for 8051开发ZigBee? 说到ZigBee开发环境搭建,很多新手都会纠结工具链的选择。我当年从STM32转向ZigBee开发时,花了整整两周时间对比各种方案,最终发现IAR for 8051 10.30.1这个版本在稳定性和兼容性上表现最好。…...

ESP32编码器驱动实战:SIQ-02FVS3硬件滤波与中断优化(附完整代码)

ESP32编码器驱动实战:SIQ-02FVS3硬件滤波与中断优化(附完整代码) 在嵌入式开发中,旋转编码器作为一种常见的人机交互输入设备,其稳定性和精确度直接影响用户体验。SIQ-02FVS3作为一款迷你型编码器,虽然体积…...

开箱即用!Qwen3-ForcedAligner镜像体验:无需配置,直接开启音文对齐之旅

开箱即用!Qwen3-ForcedAligner镜像体验:无需配置,直接开启音文对齐之旅 1. 音文对齐技术简介 你有没有遇到过这样的场景:手里有一段录音和对应的文字稿,但需要精确知道每个词在音频中出现的时间点?传统方…...

从大彩换到迪文串口屏,DMG80480C070_03WTC上手避坑全记录

从大彩到迪文串口屏:DMG80480C070_03WTC实战迁移指南 当项目预算收紧时,硬件选型往往成为降本的关键突破口。去年我们团队在工业HMI项目上遇到了这样的转折点——原本使用的大彩串口屏由于成本上涨,使得整机BOM成本超出预期15%。经过多方比对…...

mmdetection实战:5个隐藏工具让你的目标检测效率翻倍(附避坑指南)

mmdetection实战:5个隐藏工具让你的目标检测效率翻倍(附避坑指南) 当你已经熟悉了mmdetection的基础训练和测试流程后,是否感觉效率提升遇到了瓶颈?实际上,这个强大的目标检测框架还隐藏着一批鲜为人知但极…...

从 99.8% 到 14.9%!PaperZZ 降重 / 降 AIGC 双引擎:适配知网 / 维普的学术文本净化方案

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 降重/降AIGChttps://www.paperzz.cc/weight 当论文检测报告上的 AIGC 疑似度与重复率双双亮起红灯,当知网 2.13 严苛版、维普 2.26 版的检测规则让修改无从下手,毕业生往往…...

RVC WebUI变声器实战:从AI翻唱到直播实时变声的完整指南

RVC WebUI变声器实战:从AI翻唱到直播实时变声的完整指南 1. 认识RVC WebUI:声音转换的新纪元 在数字内容创作领域,声音转换技术正经历着革命性的变化。RVC WebUI(Retrieval-based Voice Conversion WebUI)作为一款基于…...

OWL ADVENTURE模型原理浅析:从卷积神经网络到视觉Transformer演进

OWL ADVENTURE模型原理浅析:从卷积神经网络到视觉Transformer演进 最近在星图GPU平台上部署和测试一些视觉模型时,我经常被问到:“这个OWL ADVENTURE模型到底用了什么技术?和传统的卷积神经网络有什么区别?” 这确实是…...

LUT(Look-Up-Table)

目录 1、1D LUT 2、3D LUT 3、手动创建LUT 3.1 准备调色素材‌ 3.2 ‌进行创意调色‌ 3.3 ‌导出为LUT文件‌ 3.4 测试与优化‌ 4、AI LUT 4.1 使用AI调色App 4.2 使用开源项目 4.3 训练专属AI模型 4.3.1 使用预训练AI模型 LUT提取工具 4.3.2 端到端 5、其他工作…...

YOLOv11实战:手把手教你用DBB改进C3k2块(附完整代码)

YOLOv11实战:DBB模块深度改造C3k2块的完整指南 1. 理解DBB模块的核心价值 在计算机视觉领域,Diverse Branch Block(DBB)作为卷积结构的创新设计,正在重新定义特征提取的方式。这种多分支结构的核心思想源于对神经网络特…...

别只抄代码!用SWUST OJ这两道C语言题,真正搞懂printf和数据类型转换

从SWUST OJ两道C语言题看printf与类型转换的深层逻辑 在编程学习的起步阶段,很多同学容易陷入"只求结果正确"的误区,却忽视了语言特性背后的设计哲学。SWUST OJ的1283和1284这两道看似简单的题目,恰恰是理解C语言输出机制和数据类型…...

3月20日紧急修复|Spring AI双漏洞CVE-2026-22730/22729实战防护方案

文章目录前言这俩漏洞到底是个啥"鬼东西"CVE-2026-22730:SQL注入的"借尸还魂"CVE-2026-22729:JSONPath的"暗度陈仓"快看看你是不是"中枪"了受影响的版本范围紧急修复:三步走战略第一步:升…...

JDK 26 HTTP/3原生客户端实战|高并发接口性能压测全流程

文章目录前言:当Java程序员的"高速公路"终于修到了家门口第一节:HTTP/3到底牛在哪?先整明白原理1.1 从TCP到UDP:这次真的"叛变"了1.2 0-RTT握手:再见了,三次握手的老规矩第二节&#x…...

QCustomPlot实战:从入门到精通的数据可视化

1. QCustomPlot基础入门:从零搭建绘图环境 第一次接触QCustomPlot时,我被它简洁的API和强大的绘图能力惊艳到了。这个基于Qt的绘图库虽然体积小巧(只有两个核心文件),但能轻松实现折线图、柱状图、散点图等常见图表&am…...

别再手动改数据了!用Vue3+ElementPlus+TS打造一个Excel式可编辑表格(附完整源码)

Vue3ElementPlusTS实战:构建Excel级交互的数据表格解决方案 在数据密集型的后台管理系统中,表格作为数据展示和操作的核心载体,其交互体验直接影响用户的工作效率。传统表格组件往往只提供基础的展示功能,而现代Web应用越来越需要…...