Spring源码阅读记录

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. 处理直接传入的 beanFactoryPostProcessorsfor (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.class, true, false);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.class, true, false);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.class, true, false);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.class, true, false);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 的 PostProcessorsortPostProcessors(priorityOrderedPostProcessors, beanFactory);invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);// 调用 Ordered 的 PostProcessorList<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());for (String name : orderedPostProcessorNames) {orderedPostProcessors.add(beanFactory.getBean(name, BeanFactoryPostProcessor.class));}sortPostProcessors(orderedPostProcessors, beanFactory);invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);// 调用剩下的无顺序的 PostProcessorList<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。
想打断点调试的,但这个断点打得我整个人都要升华了…
从最初的 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实例是根据图纸建造的房子”
夜雨聆风