# spring-framework-study **Repository Path**: antirust/spring-framework ## Basic Information - **Project Name**: spring-framework-study - **Description**: 1、该仓库为了学习spring源码而创建;初始化代码直接从spring-projects/spring-framework仓库fork的源码。 2、idooy-study是个人针对Spring源码的学习分支,个人的学习笔记以及对源代码的注释都发生在该分支上。所以该仓库真正有价值的就是idooy-study分支。 3、该仓库的默认分支是idooy-study。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: idooy-study - **Homepage**: https://spring.io/projects/spring-framework - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-20 - **Last Updated**: 2025-09-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: spring源码学习, idooy-study ## README # :bowtie: :bowtie: :bowtie: 注意:仓库维护的是idooy-study分支 :bowtie: :bowtie: :bowtie: [《Spring官方README-中文版》](https://gitee.com/antirust/spring-framework/blob/idooy-study/README.md) [《Spring Bean生命周期》](https://gitee.com/antirust/spring-framework/blob/idooy-study/.idooy/%E3%80%8ASpring%20Bean%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E3%80%8B.md) [《Spring源码项目本地部署》](https://gitee.com/antirust/spring-framework/blob/idooy-study/.idooy/%E3%80%8ASpring%E6%BA%90%E7%A0%81%E9%A1%B9%E7%9B%AE%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E3%80%8B.md) # ioc容器在Spring中的实现方式 - **BeanFactory**:IoC容器的基本实现,是Spring内部使用的接口,面向Spring本身,不提供给开发者使用。 - **ApplicationContext**:BeanFactory的子接口,在BeanFactory的基础上添加了更多高级特性,面向开 发者,几乎所有的Spring应用都使用ApplicationContext。 # FactoryBean **FactoryBean** 是 Spring 框架中的一个特殊接口,用于自定义 Bean 的创建逻辑;同样是实现自定义 Bean 的创建,为什么开发中很少使用呢?因为它是Spring容器提供的以更加灵活的方式创建复杂对象的手段。也可以 说“**FactoryBean是Spring提供的一种整合第三方框架的常用机制**”,它有专门的使用场景。比如Spring整合 Mybatis时,Spring就是通过FactoryBean机制来帮我们创建SqlSessionFactory对象的。 # BeanFactoryPostProcessor BeanDefinitionReader将配置源中的Bean定义解析构建成一个个BeanDefinition对象,这个BeanFactoryPostProcessor 接口支持用户动态操作或调整BeanDefinition对象 # Spring源码学习-BeanDefinition、BeanDefinitionReader、BeanDefinitionRegistry 在Spring框架中,‌BeanDefinition‌是描述Bean的核心数据结构, BeanDefinitionReader‌负责读取Bean配置并注册到容器, BeanDefinitionRegistry‌则是管理所有Bean定义的容器。 1、BeanDefinition 作为Spring核心接口,主要用于封装Bean的元数据信息,包括类类型、作用域、懒加载标志、初始化/销毁方法等。 Bean定义可通过XML、注解或编程方式生成,例如标签或@Component注解均会生成对应的BeanDefinition对象。 > 1、XML 配置 > 2、注解(@Component、@Service、@Repository...) > 3、配置类 > 4、properties属性文件 2、BeanDefinitionReader 该接口提供读取Bean定义的功能,具体实现包括: - XmlBeanDefinitionReader‌:解析XML配置文件 - PropertiesBeanDefinitionReader‌:读取Properties文件 - AnnotatedBeanDefinitionReader‌:加载通过注解方式定义的Bean - GroovyBeanDefinitionReader‌:支持Groovy脚本定义Bean BeanDefinitionReader 读取、解析 Resource 资源,也就是将用户定义的 Bean 表示成IoC容器的内部数据结构: BeanDefinition。在 IoC 容器内部维护着一个`beanDefinitionMap`的数据结构。那么这一个个BeanDefinition 是如何添加到这个Map中的呢?这个过程就是`BeanDefinitionRegistry`来完成。 3、BeanDefinitionRegistry 作为核心容器组件,BeanDefinitionRegistry用于集中管理所有BeanDefinition。在Spring初始化过程 中,BeanDefinitionReader会将解析的BeanDefinition注册到Registry中,后续通过BeanFactory进行实例化。 它具体能干啥?当BeanDefinitionReader将用户自定义的Bean解析成一个个BeanDefinition对象以后,通过 BeanDefinitionRegistry 接口将解析得到的 BeanDefinition 注入到IoC 容器内部维护的`BeanDefinition Map` 的集合中,IoC 容器就是通过这个 HashMap 来维护和管理这些 BeanDefinition 的 >**BeanDefinition** >spring支持xml、javaBean、@Import等方式将Bean注册进IOC,站在软件设计的角度,这么多方式且每种方式 >不尽相同,但只要我IOC容器注册的Bean的口子统一起来,我只认你BeanDefinition,我不管你是什么方式,统统 >拆碎再糅合成BeanDefinition; > >这个BeanDefinition我们也可以简单的理解成‘Bean的元数据’; > >**Spring如何构造BeanDefinition** >如果idea用的熟练,不难知道BeanDefinition接口所在子模块就是`spring-beans`,所以就尝试搜索该模块下 >的自动化测试代码,找到如下测试代码片段;主要是避免编写重复的测试代码,还有就是我们可以直接拿到Spring开发 >者们已经定义好的配置文件。 >```text >new XmlBeanDefinitionReader(this.factory).loadBeanDefinitions(new ClassPathResource("test.xml", getClass())); >``` > >**BeanDefinitionRegistry** >使用BeanDefinition定义统一的‘Bean元数据’;方便统一管理。这就无法避免会出现成千上万这样的BeanDefinition >我们如何存储和管理?当然我们最先想到的肯定是Map这样的集合,其实可以简单的理解Spring也是这样做的。 > >我们在开发过程中如果想要操作和管理Map集合,直接使用Map的API即可;同理,Spring方便管理和操作众多的 >BeanDefinition,就定义了BeanDefinitionRegistry接口,里边定义的就是操作和管理BeanDefinition容器的API。