Spring IOC 容器 **默认注册 Bean** 的 8 条规则

Spring IOC 容器 默认注册 Bean 的 8 条规则

(Spring Framework 6.x 源码级总结)

阅读提示:把下面 8 条规则背下来,再读 Spring 源码时,你会在任何一行代码里立刻知道「这个 BeanDefinition 是从哪儿来的」。


1️⃣ 环境扫描:从 启动类所在包 向下递归

  • @SpringBootApplication 内隐含 @ComponentScan 无参数 → 扫描当前包及其子包。
  • 源码位置:ComponentScanAnnotationParser#parse()ClassPathBeanDefinitionScanner#doScan()

2️⃣ 类级别注解 自动注册

遇到下列注解即注册为 singleton Bean:

  • @Component(含 @Service@Repository@Controller 等元注解)
  • @Configuration(特殊:还会生成 CGLIB 代理,见规则 4)
  • @Bean 方法所在类如果被 @Configuration 标注,则方法返回值也被注册。

3️⃣ @Bean 方法 注册规则

  • 作用域:默认 singleton;可通过 @Scope 覆盖。
  • 名字
    • 显式 value/name → 直接使用
    • 空 → 方法名首字母小写
  • 重载保护:同名 Bean 后注册的覆盖先注册的(DefaultListableBeanFactory#registerBeanDefinition 抛异常 → 允许覆盖开关 spring.main.allow-bean-definition-overriding=true)。

4️⃣ @Configuration 特殊逻辑

  • 类本身注册为 lite @Component
  • 同时注册 ConfigurationClassPostProcessor,它会:
    1. 解析 @Bean 方法
    2. 解析 @Import(普通类、ImportSelector、ImportBeanDefinitionRegistrar)
    3. 解析 @ComponentScan
    4. 生成 CGLIB 代理 保证 @Bean 方法内部依赖仍是单例。

5️⃣ @Import 的三类导入

类型注册方式示例
普通类直接注册 singleton@Import(MyConfig.class)
ImportSelectorselectImports() 返回 String[]@EnableCaching
ImportBeanDefinitionRegistrar手动 registry.registerBeanDefinition()@EnableAspectJAutoProxy

6️⃣ SPI 机制spring.factories & META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

  • Spring Boot 启动时读取 spring.factoriesEnableAutoConfiguration 列表
  • 每个自动配置类内部再用 @Configuration + @Bean 注册大量基础设施(DataSource、WebMvc、Security…)。

7️⃣ FactoryBean & BeanFactoryPostProcessor

  • FactoryBean#getObject() 的返回值被注册,名字为 &beanName(取实际对象去掉 &)。
  • BeanFactoryPostProcessor(如 PropertySourcesPlaceholderConfigurer)可在注册阶段 修改新增 BeanDefinition。

8️⃣ 默认单例作用域 & 延迟初始化

  • 默认作用域:singleton
  • 默认非延迟:容器启动即实例化;加 @Lazy 则延迟到首次调用 getBean()
  • 单例池:DefaultSingletonBeanRegistry#singletonObjects(ConcurrentHashMap)。

一张图总结

启动类包扫描 → 类注解(@Component/@Configuration) → @Bean方法↓@Import(三类) → @ComponentScan → spring.factories↓ConfigurationClassPostProcessor → 注册所有BeanDefinition↓DefaultListableBeanFactory#preInstantiateSingletons → 实例化

背完这 8 条,再读 Spring 源码时,你会在任意一行 registerBeanDefinition() 前立刻定位“这是哪条规则触发”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90957.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

29.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--用户配置服务

用户配置服务是孢子记账中最简单的部分。简单说,用户配置服务就是用户自定义的配置项存储服务,用于我们的APP根据用户的配置实现指定的功能。它提供了一个简单的接口,允许用户存储和检索他们的配置数据。就目前来说,用户配置只有一…

Python实现PDF按页分割:灵活拆分文档的技术指南

Python实现PDF按页分割:灵活拆分文档的技术指南 PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时。本文将介绍如何使用Python创建一个灵活的PDF分割工具,能够根据用户指定的页数范围任意分割文档。 需求分…

「iOS」——GCD其他方法详解

GCD学习GCD其他方法dispatch_semaphore (信号量)**什么是信号量**dispatch_semaphore主要作用dispatch_semaphore主要作用异步转同步设置一个最大开辟的线程数加锁机制dispatch_time_t 两种形式GCD一次性代码(只执行一次)dispatch_barrier_async/sync栅栏…

【图像处理基石】如何实现一个车辆检测算法?

基于AI的车牌检测和识别算法 问题描述、应用场景与难点 问题描述 车牌检测和识别是计算机视觉领域的一个特定任务,主要包含两个核心步骤: 车牌检测:从图像中准确定位车牌的位置和区域车牌识别:对检测到的车牌区域进行字符识别&…

计算机学报 2025年 区块链论文 录用汇总 附pdf下载

计算机学报 Year:2025 2024请看 1 Title: 基于区块链的动态多云多副本数据完整性审计方法研究 Authors: Key words: 区块链;云存储;多云多副本存储;数据完整性审计 Abstract: 随着云计算技术的快速发展和云存储服务的日益…

计算机网络-UDP协议

UDP(用户数据报协议)是传输层的一种无连接、不可靠、轻量级的协议,适用于对实时性要求高、能容忍少量数据丢失的场景(如视频流、DNS查询等)。以下是UDP的详细解析:1. UDP的核心特点特性说明无连接通信前无需…

子域名收集和c段查询

子域名收集方法一、sitesite: 要查询的域名可以查到相关网站二、oneforall (子域名查找工具)下载后解压的文件夹在当前文件夹打开终端然后运行命令 python oneforall.py --target xxxxxxxx(这里放你要查的网址) run最…

计网-TCP拥塞控制

TCP的拥塞控制(Congestion Control)是核心机制之一,用于动态调整发送方的数据传输速率,避免网络因过载而出现性能急剧下降(如丢包、延迟激增)。其核心思想是探测网络可用带宽,并在拥塞发生时主动…

依赖倒置原则 Dependency Inversion Principle - DIP

基本知识 1.依赖倒置原则(DIP)是面向对象设计(OOD)中的五个基本原则之一,通常被称为 SOLID 原则中的 D 2.核心思想: 高层模块不应该依赖低层模块,两者都应该依赖抽象。 (High-level modules sho…

原生input添加删除图标类似vue里面移入显示删除[jquery]

<input type"text" id"servicer-search" class"form-control" autocomplete"off" />上面是刚开始的input <div class"servicer-search-box"><input type"text" id"servicer-search" cla…

整理分享 | Photoshop 2025 (v26.5) 安装记录

导语&#xff1a; 最近整理资源时&#xff0c;发现有朋友在找新版 Photoshop。正好手边有 Photoshop 2025年7月的版本&#xff08;v26.5&#xff09;&#xff0c;就记录下来分享给大家&#xff0c;供有需要的朋友参考。关于这个版本&#xff1a;这个 Photoshop v26.5 安装包&am…

【Redis】Redis 数据存储原理和结构

一、Redis 存储结构 1.1 KV结构 Redis 本质上是一个 Key-Value&#xff08;键值对&#xff0c;KV&#xff09;数据库&#xff0c;在它丰富多样的数据结构底层&#xff0c;都基于一种统一的键值对存储结构来进行数据的管理和操作 Redis 使用一个全局的哈希表来管理所有的键值对…

【RAG优化】深度剖析OCR错误,从根源修复RAG应用的识别问题

1. 引言:OCR——RAG系统中的关键问题 当我们将一个包含扫描页面的PDF或一张报告截图扔给RAG系统时,我们期望它能“读懂”里面的内容。这个“读懂”的第一步,就是OCR。然而,OCR过程并非100%准确,它受到图像质量、文字布局、字体、语言等多种因素的影响。 一个看似微不足道…

【第六节】方法与事件处理器

方法与事件处理器 方法处理器 可以用 v-on 指令监听 DOM 事件: <div id="example"> <button v-on:click="greet">Greet</button></div>绑定一个单击事件处理器到一个方法 greet 。下面在 Vue 实例中定义这个方法 var vm=new V…

大语言模型Claude 4简介

Anthropic公司成立于2021年&#xff0c;由一群OpenAI前员工组成。他们最新发布的大语言模型(Large Language Model, LLM) Claude 4系列包括两个版本&#xff1a;Claude Opus 4和Claude Sonnet 4&#xff1a;(1).Claude Sonnet 4&#xff1a;是Claude Sonnet 3.7的升级&#xff…

国产化PDF处理控件Spire.PDF教程:Python 将 PDF 转换为 Markdown (含批量转换示例)

PDF 是数字文档管理的普遍格式&#xff0c;但其固定布局特性限制了在需要灵活编辑、更新或现代工作流集成场景下的应用。相比之下&#xff0c;Markdown&#xff08;.md&#xff09;语法轻量、易读&#xff0c;非常适合网页发布、文档编写和版本控制。 E-iceblue旗下Spire系列产…

PDF转Markdown - Python 实现方案与代码

PDF作为广泛使用的文档格式&#xff0c;转换为轻量级标记语言Markdown后&#xff0c;可无缝集成到技术文档、博客平台和版本控制系统中&#xff0c;提高内容的可编辑性和可访问性。本文将详细介绍如何使用国产Spire.PDF for Python 库将 PDF 文档转换为 Markdown 格式。 技术优…

深度解析 inaSpeechSegmenter:高效音频语音分割与检测开源工具

项目简介 inaSpeechSegmenter 是法国国家视听研究院(INA)开源的音频分割与检测工具,专为广播、播客、采访、影视等多媒体内容的自动化处理设计。它能够高效地将长音频自动分割为语音、音乐、噪声、静音等片段,并支持性别检测(男声/女声),为后续的语音识别、内容检索、转…

VirtualBox安装Ubuntu 22.04后终端无法打开的解决方案

问题现象在VirtualBox中使用"快速安装"模式安装Ubuntu 22.04后图形终端&#xff08;gnome-terminal&#xff09;无法通过图标或快捷键(CtrlAltT)启动系统其他功能正常根本原因语言环境(Locale)配置异常导致&#xff1a;快速安装模式可能跳过Locale生成步骤gnome-term…

java磁盘操作与IO流(序列化、Properties类)

目录 一、磁盘操作 1、File类&#xff1a; &#xff08;1&#xff09;创建File对象&#xff1a; &#xff08;2&#xff09;获取文件信息&#xff1a; &#xff08;3&#xff09;判断文件 &#xff08;4&#xff09;删除文件 &#xff08;5&#xff09;创建文件&#xff…