Spring 源码阅读 BeanFactory(二) 之registerBeanDefinition方法

Spring源码解析之【BeanFactory】与【BeanDefinitionRegistry】 在分析了Spring的源码之后发现,Spring里面用了很多的BeanFactory,这个类非常重要,因为实际上在Spring中BeanFactory是IOC容器的实际代表者,它用来创建和管理Bean。它为其他具体的IOC容器提供了最基本的规范,它是一个接口类型。 BeanFactory是最典型的工厂方法模式。不同类型的工厂会生产不同类型的商品。它的子接口和对应的实现类结构如下: 我们可以看到在... 阅读详情

BeanFactory内部对BeanDefinition的维护

接上文

@Override
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
            throws BeanDefinitionStoreException {
        //一些参数校验
        Assert.hasText(beanName, "Bean name must not be empty");
        Assert.notNull(beanDefinition, "BeanDefinition must not be null");

        if (beanDefinition instanceof AbstractBeanDefinition) {
            try {
                ((AbstractBeanDefinition) beanDefinition).validate();
            }
            catch (BeanDefinitionValidationException ex) {
                throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
                        "Validation of bean definition failed", ex);
            }
        }

        BeanDefinition oldBeanDefinition;
        //在beanDefinitionMap,根据beanName取得BeanDefinition
        //beanDefinitionMap的定义(Map of bean definition objects, keyed by bean name )
        oldBeanDefinition = this.beanDefinitionMap.get(beanName);
        if (oldBeanDefinition != null) {//如果已经有该bean
            if (!isAllowBeanDefinitionOverriding()) { //(是否允许ID相同的Bean覆盖,不指定时默认为true)
                throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
                        "Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +
                        "': There is already [" + oldBeanDefinition + "] bound.");
            }
            else if (oldBeanDefinition.getRole() < beanDefinition.getRole()) {
                // e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTURE
                if (this.logger.isWarnEnabled()) {
                    this.logger.warn("Overriding user-defined bean definition for bean '" + beanName +
                            "' with a framework-generated bean definition: replacing [" +
                            oldBeanDefinition + "] with [" + beanDefinition + "]");
                }
            }
            else if (!beanDefinition.equals(oldBeanDefinition)) {//新注入的bean的定义,和旧的不想等
                if (this.logger.isInfoEnabled()) {
                    this.logger.info("Overriding bean definition for bean '" + beanName +
                            "' with a different definition: replacing [" + oldBeanDefinition +
                            "] with [" + beanDefinition + "]");
                }
            }
            else {
                if (this.logger.isDebugEnabled()) {
                    this.logger.debug("Overriding bean definition for bean '" + beanName +
                            "' with an equivalent definition: replacing [" + oldBeanDefinition +
                            "] with [" + beanDefinition + "]");
                }
            }
            this.beanDefinitionMap.put(beanName, beanDefinition);
        }
        else {//否则之前没有定义过同名的Bean
            if (hasBeanCreationStarted()) {//判断BeanFactory 中Bean的创建阶段是否已经开始,这里是已经开始
                // Cannot modify startup-time collection elements anymore (for stable iteration)
                synchronized (this.beanDefinitionMap) {
                    this.beanDefinitionMap.put(beanName, beanDefinition);//先将Bean的定义维护起来
                    List<String> updatedDefinitions = new ArrayList<String>(this.beanDefinitionNames.size() + 1); //注意:这里是一处优化,直接生成期望大小的List
                    updatedDefinitions.addAll(this.beanDefinitionNames);
                    updatedDefinitions.add(beanName);
                    this.beanDefinitionNames = updatedDefinitions;//更新bean定义名字的引用
                    if (this.manualSingletonNames.contains(beanName)) {
                        Set<String> updatedSingletons = new LinkedHashSet<String>(this.manualSingletonNames);
                        updatedSingletons.remove(beanName);
                        this.manualSingletonNames = updatedSingletons;
                    }
                }
            }
            else {//bean的创建阶段还没有开始
                // Still in startup registration phase
                this.beanDefinitionMap.put(beanName, beanDefinition); //直接在维护列表中加入新注册的beanDefinition
                this.beanDefinitionNames.add(beanName);
                this.manualSingletonNames.remove(beanName);
            }
            this.frozenBeanDefinitionNames = null;
        }

        if (oldBeanDefinition != null || containsSingleton(beanName)) { //如果有同名的bean,重置之
            resetBeanDefinition(beanName);
        }
    }
PG-FP6编程器错误代码解析与高效排障实战指南 在嵌入式系统开发与量产烧录中,编程器是连接开发环境与目标硬件的重要桥梁。其工作原理是通过特定的通信协议(如UART、SWD)与微控制器(MCU)建立连接,完成程序代码的写入、擦除与校验。这项技术的核心价值在于确保固件能够准确、可靠地部署到硬件中,是产品从原型到量产的关键环节。在实际的工程实践中,尤其是在使用瑞萨(Renesas)PG-FP6这类编程器进行调试或批量生产时,工程师常会遇到各种通信失败、编程验证错误或电源异常等问题,这些问题往往以特定的错误代码形式呈现。深入理解这些错误代码背后的硬件连接、电源时 阅读详情

相关推荐

双目视觉实战:用Bouguet算法实现极线校正的完整代码解析

本文详细解析了Bouguet算法在双目视觉极线校正中的完整实现流程与性能调优技巧。通过旋转平分策略和基线对齐,Bouguet方法显著降低图像畸变并提升匹配精度,相比传统Hartley校正法平均重投影误差降低53%。文章涵盖从相机标定到OpenCV实战的全过程,并分享工业级调参策略,帮助开发者实现高精度立体视觉系统。

f9g0h的博客 265

SpringBoot 基础概念:注册BeanDefinition

Spring注册BeanDefinition

java_xiaoba1的博客 947

【Anaconda】conda国内镜像源快速配置指南(清华/阿里云)

本文详细介绍了如何为Anaconda配置国内镜像源(清华/阿里云),以显著提升conda包下载速度并减少安装失败率。通过分步指南和实用技巧,帮助开发者快速完成配置,优化Python开发环境。

weixin_33725722的博客 1486

BeanDefinition的注册

上节完成对BeanDefinition的解析分析后,下面继续了解BeanDefinition的注册过程 main方法 public static void main(String[] args) { //1.资源定位 Resource resource = new ClassPathResource("bean.xml"); //2.创建IOC容器,这里使用DefaultListableBeanFactory作为IOC容器 DefaultListableBeanFactory default

保质期已过 592

大彩串口屏+LUA避坑指南:从Flash读写到控件状态配置的5个常见问题

本文针对大彩串口屏的LUA脚本开发,深度剖析了Flash数据存储与控件状态配置中的5个常见陷阱。重点讲解了如何通过标志位安全初始化Flash、正确处理多字节数据转换,以及如何精准配置按钮与文本控件的状态与事件响应,帮助开发者提升开发效率与代码可靠性。

weixin_27945229的博客 242

【亲测可用!】阿里达摩院开源实时数字人对话VideoChat本地部署教程(8G显存可跑)

本文主要记录在部署阿里达摩院开源实时数字人对话VideoChat时遇到的问题,希望对各位技术开发或爱好者有所帮助!

波点兔的博客 3892

spring源码中BeanFactory、BeanDefinition、BeanDefinitionRegistry、AnnotatedBeanDefinition几个关键的接口及相关实现

前言 在前面分析Spring IoC容器的时候,贯穿全文的一个概念:Bean定义信息。它是Spring容器的一个核心概念,那么本文就深入分析一下BeanDefinition这个接口(类)。 Spring容器启动的过程中,会将Bean解析成Spring内部的BeanDefinition结构。 不管是是通过xml配置文件的\<Bean>标签,还是通过注解配置的@Bean,它最终都会被解...

dianxiaoer20111的博客 1278

Cesium 模拟飞机坠毁功能

Cesium 模拟飞机坠毁功能,粒子模拟

QQhelphelp的博客 1068

BeanFactory处理bean生命周期全流程

BeanFactory的默认实现为DefaultListableBeanFactory,其中Bean生命周期与方法映射如下,建议参考源码一起看。 一、BeanDefinition注册阶段-registerBeanDefinition 这个阶段分为两个部分:首先通过 beanName 注册 BeanDefinition ,然后再注册别名 alias。 通过 beanName 注册 处...

chuhx的专栏 662

槽型光电开关传感器原理图设计,已量产(光电传感器)

在嵌入式设备的位置限位、物料计数等场景中,槽型光电开关是性价比极高的传感器方案 —— 它通过遮挡发射器与接收器之间的光路实现电平切换,电路简单且抗干扰性优于漫反射式光耦。今天分享一个实际项目中落地的槽型光电开关检测电路,从器件选型到逻辑设计都做了简化适配,适合小批量原型或低成本产品的需求。

不脱发的程序猿 718

使用Gitlab 搭建私有镜像仓库(外置Nginx)

为了让团队尽快使用Gitlab的CI进行工作,必须做好Gitlab的初始化工作,大家都知道拉取镜像由于某些原因,会比较慢,因此构建自己的私有镜像仓库就成为了关键的一步。当然私有镜像仓库的搭建有很多种方式,这里直接使用Gitlab提供的镜像仓库功能。一揽子解决方案比较香。gitlab真的越来越好用了,有了这个镜像仓,也没必要再使用三方的镜像仓库了。Devops 真好用!

网尘的技术专栏 1829

聚焦IOC容器刷新环节postProcessBeanFactory(BeanFactory后置处理)专项

在很早之前我们单独写过一篇文章《分析SpringBoot启动配置原理》,具体可见:解析SpringBoot启动配置原理其中IOC容器的刷新环节可当重点分析,值得在读源码时进行深入分析,我们会从多个方向上再次进行分析回顾和学习。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 9万+

<PLC><socket><汇川>汇川PLC使用socket与其他控制器(如上位机)通讯模板程序示例

以上介绍了汇川PLC通用socket通讯的示例,事实上,汇川的官方手册也有使用示例,可以直接仿照使用,也可以加以修改。

用沸腾的热血,支付我们的人生吧! 3248

Spring源码阅读方法论:从核心模块到系统化理解

Spring框架作为Java生态的核心基础设施,其IoC容器和AOP实现是理解设计模式与架构思想的经典案例。通过模块化分解策略,开发者可以从spring-core基础工具类入手,逐步深入Bean生命周期管理和依赖注入原理。源码阅读的关键在于把握BeanFactory、ApplicationContext等核心接口的设计哲学,结合单元测试和流程追踪法建立系统认知。在工程实践中,合理使用IDEA调试工具和序列图插件能有效提升阅读效率,而理解循环依赖解决机制和动态代理实现则对架构设计具有普遍参考价值。掌握这些方法

weixin_30613727的博客 343

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring源码阅读:从BeanFactory契约到DefaultListableBeanFactory核心实现

Spring的IoC容器是Java企业级开发的地基,而理解它的入口往往不在于ApplicationContext的refresh方法,而在于更底层的BeanFactory接口。BeanFactory本质是一份获取Bean的契约,它定义了getBean、containsBean等能力,将“创建对象”的细节完全下沉到实现类中。真正承载容器所有功能的,是DefaultListableBeanFactory——它既是BeanDefinition的注册表,也是单例缓存的管理者,更是ApplicationContext

weixin_32306957的博客 185

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

spring5源码阅读-2.xml解析bean标签

前文中提到可以to通过 ClassPathXmlApplicationContext appcationContext = new ClassPathXmlApplicationContext("spring.xml"); Student student = (Student) appcationContext.getBean("student"); <beans xmlns=...

b422761838的专栏 213

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring核心揭秘:BeanFactory与DefaultListableBeanFactory源码主线解析

在Spring框架中,IoC容器是管理对象生命周期与依赖关系的核心机制,而BeanFactory定义了容器最基础的契约。作为最常用的实现类,DefaultListableBeanFactory同时扮演了BeanDefinition注册表与单例工厂的双重角色,为依赖注入、自动装配以及按类型查找等能力提供了底层支撑。理解Bean的创建流程,需要沿着getBean调用链深入抽象类模板方法与三级缓存机制,其中三级缓存通过提前暴露单例工厂精巧地解决了字段循环依赖问题。同时,BeanDefinition的注册与后处理器

weixin_31766003的博客 178

Spring 源码阅读 09:加载 BeanDefinition 的过程(注册阶段)

传入方法的参数,一个是之前解析道的 BeanDefinitionHolder,另一个其实就是我们最初创建的 BeanFactory(这里为什么是最初创建的 BeanFactory?这里的逻辑也比较简单,举个例子就是,检查是不是存在一个beanName是a别名是b的 Bean,同时又存在一个beanName是b别名是a的Bean。这里针对配置了 MethodOverrides 的 BeanDefinition,从 Bean 对应的类中获取同名的方法,也就是要被覆盖的方法。

知识分享官 178

Spring IOC源码解析:从BeanFactory到三级缓存,彻底理解容器原理

IOC容器是Spring框架的核心,而真正理解其源码实现是突破框架使用瓶颈的关键。BeanFactory作为容器最底层的工厂契约,定义了Bean获取与基础查询的最小接口,ApplicationContext则通过组合机制扩展出事件发布、国际化等企业级能力。BeanDefinition作为Bean的“原始图纸”,完整描述了类信息、作用域与依赖关系,是实例化前的核心模型。围绕这两者,容器的启动流程、Bean生命周期以及三级缓存等机制共同构成了Spring强大的依赖管理能力。掌握这些底层原理,不仅有助于破解循环依

weixin_29698641的博客 169

calibre 把 PDF 转成 EPUB 只需 5 步:免费的电子书格式转换完整指南

固定版式的 PDF 在手机窄屏上,每读一页都要缩放两次。calibre 是开源免费的电子书管理工具,EPUB、PDF、AZW3 等三十多种格式可以互相转换,还能按作者、标签把整个书库管起来。这篇指南帮你 5 分钟跑通第一次转换,再覆盖手机重排、Kindle 传书、批量转换三个高频需求,最后附一份验收清单。 ## 📖 第一次转换 calibre 电子书:从安装到出 EPUB 的 5 步 1.

gitblog_01035的博客 408

dsh-market:三步装好 DSH 插件市场,主题一键安装即时生效

dsh-market 是装在 DeepSeek Harness(DSH)里的可视化插件市场:打开 **插件市场** 就能浏览、搜索并一键安装 4200+ 社区插件,主题装完立即生效、切换不用重启。这篇指南帮你在 10 分钟内从装好到会用核心功能。 以前换主题要改配置文件、重启进程、再刷新页面,现在点一下就行。 [![dsh-market DSH 插件市场浏览界面](https://raw.gi

gitblog_00504的博客 227

Spring源码笔记,将BeanDefinition注册进IoC容器

这篇文章分享一下spring IoC容器初始化第三部分的代码,也就是将前面解析得到的BeanDefinition注册进IoC容器,其实就是存入一个ConcurrentHashMap<String, BeanDefinition>中。 1、回过头看一下前面在DefaultBeanDefinitionDocumentReader中实现的processBeanDefinition(Eleme...

Nicholas.S的博客 1267

spring源码分析6: ApplicationContext的初始化与BeanDefinition的搜集入库

先前几篇都是概念的讲解:回顾下 BeanDefinition 是物料 Bean是成品 BeanFactory是仓库,存储物料与成品 ApplicationContext初始化搜集物料入库,触发生产线,取出物料生产Bean 本文研究springboot环境下,ApplicationContext的初始化, 多是处理注解形式的Bean. 重要组件 1.PostProcessorRegistrati...

2017年 490

Spring设计模式面试解析与实战应用

设计模式是构建可维护、可扩展软件系统的核心方法论,其本质是通过特定结构解决重复出现的架构问题。Spring框架作为Java生态的基石,巧妙运用工厂模式、代理模式等经典设计思想,实现了控制反转(IoC)和面向切面编程(AOP)等核心机制。从技术实现看,BeanFactory体现工厂模式精髓,AOP动态代理展示策略模式应用,而JdbcTemplate则是模板方法模式的典范。这些模式在微服务配置中心、电商交易系统等高并发场景中发挥关键作用,例如通过观察者模式实现订单状态异步通知,利用适配器模式处理多协议接入。掌握

weixin_30266885的博客 370

Spring Boot 之 BeanDefinitionLoader 详解

本文分析了Spring Boot中BeanDefinitionLoader的核心实现。BeanDefinitionLoader负责在应用启动时加载Bean定义,主要有四种方式:注解、XML配置、Groovy脚本和类路径扫描。其中默认使用AnnotatedBeanDefinitionReader进行注解方式的加载。

若千年后 262

理解IOC与DI:Spring容器初始化与依赖注入解析

本文探讨了Spring框架中的**IOC(控制反转)和DI(依赖注入)**概念。通过IOC容器管理对象的创建与依赖关系,解耦组件间的联系,提高系统灵活性。DI作为IOC的实现方式,简化了依赖管理,降低了代码耦合度。文章还讲解了Spring容器的初始化过程及依赖注入的实现,帮助开发者更好地理解和应用这些核心特性。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 87万+
上一篇: MySQL 加锁处理分析
下一篇: 解决IntelliJ IDEA中文输入法下,输入提示框不跟随问题
weiythi
博客等级 码龄16年 23粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值