Spring容器对Bean处理流程的源码解析
一、核心流程
-
加载bean定义
- 实例化
1.执行Before实例化BeanPostProcessor.postProcessBeforelnstantiation
2.执行构造方法
3.执行After实例化BeanPostProcessor.postProcessAfterInstantiation
- 属性注入
4.执行属性处理BeanPostProcessor.postProcessProperties
5.执行set注入方法
6.执行Aware方法
- 初始化
7.执行Before初始化BeanPostProcessor.postProcessBeforelnitialization
8.执行InitializingBean方法afterPropertiesSet
9.执行配置初始化方法initMethod,@PostConstruct注解的方法
10.执行After初始化BeanPostProcessor. postProcessAfterlnitialization
- 业务操作
11.执行业务方法
- 销毁
12.执行Betore销毁BeanPostProcessor.postProcessBetoreDestruction
13.执行销毁方法
DisposableBean方法destroy
执行配置销毁方法destrovMethod
@PreDestroy注解的方法
二、PostProcessor
1.诸多PostProcessor的调用顺序
-
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation
-
MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition
-
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
-
BeanPostProcessor.postProcessBeforeInitialization
-
BeanPostProcessor.postProcessAfterInitialization
-
DestructionAwareBeanPostProcessor.postProcessBeforeDestruction(销毁)
2.applyMergedBeanDefinitionPostProcessors说明
在Java反射中, 我们会经常的遇到Field、Method、Constructor类, 而本次我们提到的第一个类就是Member,该类就是上面几个类的父类, Spring为了能够使得获取到的方法、属性都放在一个地方, 采用
了接口编程, 将其都变成了Member类型,当Spring扫描到一个方法加了@Autowired的时候, 就会将该方法反射获得到Method变为一个Member, 然后将其放到InjectedElement中, 换句话说,InjectedElement
就是对一个方法或者属性的一个封装, 除了有Member存储原始的反射信息外, 还会有额外的信息, 比如required属性, 表示是否是必须注入的
3.类图分析

浙公网安备 33010602011771号