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的调用顺序

  1. InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation

  2. MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition

  3. InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation

  4. BeanPostProcessor.postProcessBeforeInitialization

  5. BeanPostProcessor.postProcessAfterInitialization

  6. DestructionAwareBeanPostProcessor.postProcessBeforeDestruction(销毁)

2.applyMergedBeanDefinitionPostProcessors说明

  在Java反射中, 我们会经常的遇到Field、Method、Constructor类, 而本次我们提到的第一个类就是Member,该类就是上面几个类的父类, Spring为了能够使得获取到的方法、属性都放在一个地方, 采用

了接口编程, 将其都变成了Member类型,当Spring扫描到一个方法加了@Autowired的时候, 就会将该方法反射获得到Method变为一个Member, 然后将其放到InjectedElement中, 换句话说,InjectedElement

就是对一个方法或者属性的一个封装, 除了有Member存储原始的反射信息外, 还会有额外的信息, 比如required属性, 表示是否是必须注入的

3.类图分析

bean扩展处理器

 

 

posted @ 2022-08-11 22:05  windge  阅读(85)  评论(0)    收藏  举报