乐于分享
好东西不私藏

Spring源码阅读记录

Spring源码阅读记录

我也不知道这两天为什么要研究Spring的源码… 
感谢deepseek 老师的帮助。
一、一些比较重要的文件

bean实例化 : abstractAutowireCapableBeanFactory 

依赖注入:AutowiredAnnotationBeanPostProcessor

Spring MVC:InvocableHandlerMethod

工具类:

org.springframework.beans.BeanUtils 、 org.springframework.util.ReflectionUtils

BeanFactory 、 ApplicationContext 、 BeanDefinition 、BeanPostProcessor 、 DefaultListableBeanFactory 、 XmlBeanDefinitionReader 、 AnnotatedBeanDefinitionReader、 InstantiationAwareBeanPostProcessor

二、 

1. IOC容器启动&Bean 创建流程

入口:ApplicationContext.refresh()

关键步骤:

加载 BeanDefinition(XmlBeanDefinitionReader 或注解解析器)

调用 BeanFactoryPostProcessor 修改 BeanDefinition(例如 ConfigurationClassPostProcessor 处理 @Configuration)

注册 BeanPostProcessor

实例化单例 Bean(DefaultListableBeanFactory.preInstantiateSingletons() → AbstractAutowireCapableBeanFactory.getBean() → createBean() → doCreateBean() → 你之前看到的 createBeanInstance() 反射构造)

依赖注入(populateBean() 里调用 AutowiredAnnotationBeanPostProcessor 进行反射注入)

初始化(initializeBean() 里调用 @PostConstruct、InitializingBean、自定义 init-method)

/** * 调用所有的 BeanFactoryPostProcessor,包括直接传入的和容器中注册的。 * 按照优先级顺序:PriorityOrdered -> Ordered -> 无顺序。 * 如果 BeanFactory 是 BeanDefinitionRegistry,还会特殊处理 BeanDefinitionRegistryPostProcessor。 * * @param beanFactory 当前的 BeanFactory * @param beanFactoryPostProcessors 已经手动实例化的 BeanFactoryPostProcessor 列表(通常来自 ApplicationContext 的硬编码添加) */publicstaticvoidinvokeBeanFactoryPostProcessors(        ConfigurableListableBeanFactory beanFactory,        List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {    // 记录已经处理过的 PostProcessor 名称,避免重复调用    Set<String> processedBeans = new HashSet<>();    // 情况1:BeanFactory 同时也是 BeanDefinitionRegistry(绝大多数 ApplicationContext 都满足)    if (beanFactory instanceof BeanDefinitionRegistry) {        BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;        // 存放普通的 BeanFactoryPostProcessor(非 Registry 类型)        List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();        // 存放 BeanDefinitionRegistryPostProcessor 类型(包括手动传入的)        List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();        // 1. 处理直接传入的 beanFactoryPostProcessors        for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {            if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {                BeanDefinitionRegistryPostProcessor registryProcessor =                        (BeanDefinitionRegistryPostProcessor) postProcessor;                // 立即调用其 postProcessBeanDefinitionRegistry 方法                registryProcessor.postProcessBeanDefinitionRegistry(registry);                registryProcessors.add(registryProcessor);            } else {                regularPostProcessors.add(postProcessor);            }        }        // -------------------------------------------------------------        // 2. 从容器中获取所有 BeanDefinitionRegistryPostProcessor 类型的 bean,        //    并按照 PriorityOrdered -> Ordered -> 无顺序 分组调用        // -------------------------------------------------------------        List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();        // 2.1 获取实现了 PriorityOrdered 的 RegistryPostProcessor 并调用        String[] postProcessorNames =                beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.classtruefalse);        for (String ppName : postProcessorNames) {            if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {                currentRegistryProcessors.add(                        beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));                processedBeans.add(ppName);            }        }        // 排序后调用        sortPostProcessors(currentRegistryProcessors, beanFactory);        registryProcessors.addAll(currentRegistryProcessors);        invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);        currentRegistryProcessors.clear();        // 2.2 获取实现了 Ordered 的 RegistryPostProcessor 并调用        postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.classtruefalse);        for (String ppName : postProcessorNames) {            if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {                currentRegistryProcessors.add(                        beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));                processedBeans.add(ppName);            }        }        sortPostProcessors(currentRegistryProcessors, beanFactory);        registryProcessors.addAll(currentRegistryProcessors);        invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);        currentRegistryProcessors.clear();        // 2.3 循环获取剩余的 RegistryPostProcessor(没有优先级顺序的)        //     因为前面处理的过程中可能会注册新的 RegistryPostProcessor,所以需要 while 循环反复查找直到不再新增        boolean reiterate = true;        while (reiterate) {            reiterate = false;            postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.classtruefalse);            for (String ppName : postProcessorNames) {                if (!processedBeans.contains(ppName)) {                    currentRegistryProcessors.add(                            beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));                    processedBeans.add(ppName);                    reiterate = true;                }            }            sortPostProcessors(currentRegistryProcessors, beanFactory);            registryProcessors.addAll(currentRegistryProcessors);            invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);            currentRegistryProcessors.clear();        }        // 3. 调用所有的 RegistryPostProcessor 的 postProcessBeanFactory 方法(父接口方法)        invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);        // 4. 调用普通的 BeanFactoryPostProcessor(非 Registry 类型)        invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);    } else {        // 情况2:BeanFactory 不是 BeanDefinitionRegistry,那么直接调用传入的处理器(没有注册新的机会)        invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);    }    // -------------------------------------------------------------    // 5. 处理所有 BeanFactoryPostProcessor(普通类型,不包括已经处理过的 RegistryPostProcessor)    // -------------------------------------------------------------    String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.classtruefalse);    List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();    List<String> orderedPostProcessorNames = new ArrayList<>();    List<String> nonOrderedPostProcessorNames = new ArrayList<>();    for (String ppName : postProcessorNames) {        if (processedBeans.contains(ppName)) {            // 已经作为 RegistryPostProcessor 处理过了,跳过            continue;        }        if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {            priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));        } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {            orderedPostProcessorNames.add(ppName);        } else {            nonOrderedPostProcessorNames.add(ppName);        }    }    // 调用 PriorityOrdered 的 PostProcessor    sortPostProcessors(priorityOrderedPostProcessors, beanFactory);    invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);    // 调用 Ordered 的 PostProcessor    List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());    for (String name : orderedPostProcessorNames) {        orderedPostProcessors.add(beanFactory.getBean(name, BeanFactoryPostProcessor.class));    }    sortPostProcessors(orderedPostProcessors, beanFactory);    invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);    // 调用剩下的无顺序的 PostProcessor    List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());    for (String name : nonOrderedPostProcessorNames) {        nonOrderedPostProcessors.add(beanFactory.getBean(name, BeanFactoryPostProcessor.class));    }    invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);    // 清理元数据缓存(例如解析的泛型信息)    beanFactory.clearMetadataCache();}

2. AOP代理创建流程

入口:AbstractAutoProxyCreator(实现了 BeanPostProcessor)

关键:在 postProcessAfterInitialization() 中,判断 Bean 是否需要被增强(比如有没有 @Transactional、@Aspect),如果需要,就通过 JDK 动态代理 或 CGLIB 反射生成代理对象,替换原来的 Bean。

想打断点调试的,但这个断点打得我整个人都要升华了… 

 三、 已经追踪到的完成一个调用链 — Spring 通过反射创建Bean实例的完整过程

从最初的 postProcessMergedBeanDefinition 一路深入到 ctor.newInstance,已经亲眼看到了 Spring 通过反射创建 Bean 实例的完整过程。

下面是一个完整的调用链总结:
AbstractApplicationContext.refresh()                    // 容器启动入口  └─> finishBeanFactoryInitialization()                 // 实例化所有单例 Bean        └─> DefaultListableBeanFactory.preInstantiateSingletons()              └─> AbstractBeanFactory.getBean()                    └─> AbstractAutowireCapableBeanFactory.createBean()                          └─> doCreateBean()                                ├─> createBeanInstance()      ★ 实例化入口                                │     ├─> instantiateBean()   // 使用默认无参构造                                │     │     └─> SimpleInstantiationStrategy.instantiate()                                │     │           ├─> clazz.getDeclaredConstructor()   // 反射获取构造器                                │     │           └─> BeanUtils.instantiateClass()                                │     │                 └─> ctor.newInstance(args)      ★ 反射创建对象                                │     └─> autowireConstructor() // 有参构造器注入(类似链路)                                └─> populateBean()              // 依赖注入

— Spring 正在用反射创建你的业务 Bean–

四、Spring 容器启动的简化时序图

Spring 中除了 “创建对象实例”用到反射。还有两个核心地方也大量使用反射:

1. 依赖注入

2. AOP代理创建 —— 反射生成代理对象

五、IDEA 中断点追踪

六、一些面试题

1.Spring中哪些地方使用了反射?举例说明

实例化Bean:Constructor.newInstance()

依赖注入:Field.set()注入@autowired字段,Method.invoke()注入setter方法

AOP代理调用:JdkDynamicAopProxy.invoke()或cglibAopProxy.intercept() 中的Method.invoke()调用目标方法

工具类:BeanUtils.instantiateClass()、ReflectionUtils中的各种反射操作

2. 描述Spring IOC容器启动过程中,一个Bean从定义到实例化的完整流程

入口:AbstractApplicationContext.refresh()

步骤:

    1. 加载BeanDefinition(XML或注解)

    2.调用BeanFactoryPostProcessor处理BeanDefinition

    3. 注册BeanPostProcessor

    4.finishBeanFactoryInitialization()开始实例化单例Bean

     5.createBeanInstamce()通过构造器反射 创建对象

    6. populateBean()进行依赖注入

    7.initializeBean()执行初始化方法,以及BeanPostProcessor的前后处理(包括AOP代理创建)

    8.返回Bean实例

3.@Autowired注解的工作原理是什么?

由AutowiredAnnotationBeanPostProcessor处理

在PostProcessMergedBeanDefinition中扫描@Autowired字段/方法/构造器,并缓存元数据

在populationBean()阶段,调用postProcessProperties()执行注入

对于字段:field.set(bean,value)反射赋值

对于方法:method.invoke(bean,args)反射调用

支持private字段(通过ReflectionUtils.makeAccessible)

4.Spring AOP是如何创建代理对象的?代理对象如何调用目标方法?

使用AbstractAutoProxyCreator(实现BeanPostProcessor)

在postProcessAfterInitialization()中判断:如果Bean匹配切面,则调用wrapIfNecessary()创建代理

代理方式:JDK动态代理(有借口)或CGLIB(无接口/配置)

代理对象调用方法时,进入拦截器链(JdkDynamicAopProxy.invoke() 或cglibAopProxy.intercept())

执行增强逻辑后,通过method.invoke(target,args)反射调用原始目标算法

5.BeanFactory 和 ApplicationContext的区别

BeanFactory是Spring的基础容器,提供延迟实例化(懒加载)

ApplicationContext集成BeanFactory,增加国际化,事件传播,环境抽象等企业级功能

ApplicationContext在启动时会立即实例化单例Bean(非懒加载)

ApplicationContext 会自动注册BeanPostProcessor和BeanFactoryPostProcessor

通常开发用ApplicationContext(如AnnotationConfigApplicationContext)

6.BeanPostProcessor 和 BeanFactoryPostProcessor有什么不同?

BeanFactoryPostProcessor作用于BeanDefinition在Bean实例化之前,可以修改Bean的元数据(例:属性值)

BeanPostProcessor 作用于Bean实例在实例化之后,可以敢于Bean的初始化过程(如代理替换)

BeanFactoryPostProcessor 典型实现:ConfigurationClassPostProcessor(处理@Configuration)

BeanPostProcessor 典型实现:AutowiredAnnotationBeanPostProcessor、AbstractAutoProxyCreator

7. Spring中如何解决循环依赖?(结合源码)

主要针对单例setter注入:构造器注入无法解决

Spring使用三级缓存(DefaultSingletonBeanRegistry)

    – singletonObjects (一级缓存,完全初始化后的单例)

    – earlySingletonObjections(二级缓存,二级暴露的对象)

    – singletonFactories(三级缓存,存放对象工厂)

流程:

    1. A创建时,存入三级缓存工厂

    2. A填充属性时,发现依赖B

     3. B创建,并填充属性时发现A

    4. 从三级缓存工厂获取A的早期引用(未完成属性填充)放入二级缓存

    5. B完成注入后,完全初始化并存入一级缓存

    6. A继续完成注入和初始化

8.如何调试Spring源码?以实例化或依赖注入为例

启动Debug,在AbstractApplicationContext.refresh()处打点

逐步进入 finishBeanFactoryInitialization() -> preInstantiateSingletons() – > getBean() -> createBean() 

在AutowiredFieldElement.inject()查看field.set() 反射赋值

使用条件断点(beanName.equals(“xxx”))过滤无关Bean

利用调用栈(Call Stack)理解整体调用链

9.Spring中的FactoryBean和BeanFactory区别

BeanFactory 是Spring容器的顶层接口,负责管理Bean

FactoryBean是一种特殊的Bean,用于生成复杂对象的Bean

通过FactoryBean的getObject()方法返回实际的Bean实例(例如ProxyFactory生成代理)

获取FactoryBean本身需要加&前缀:&myFactoryBean

10.解释BeanDefinition的作用及其与Bean实例的关系

BeanDefinition是Bean的元数据。描述Bean的类名、作用域、懒加载、依赖、构造函数参数等。

Spring启动时,先解析配置(XML\注解),生成BeanDefinition并注册到BeanFactory

实例化时根据BeanDefinition创建真正的Bean实例

关系“BeanDefinition是图纸,Bean实例是根据图纸建造的房子”