跟着小马哥学系列之 Spring IoC(源码篇:Bean 生命周期)
学成路更宽,吊打面试官。 ——小马哥
简介
大家好,我是小马哥成千上万粉丝中的一员!2019年8月有幸在叩丁狼教育举办的猿圈活动中知道有这么一位大咖,从此结下了不解之缘!此系列在多次学习极客时间《小马哥讲Spring核心编程思想》基础上形成的个人一些总结。希望能帮助各位小伙伴, 祝小伙伴早日学有所成。 分为基础篇、进阶篇、源码篇。玩游戏看颜色,学技术看版本,本系列以 Spring 5.2.2.RELEASE 版本为基础进行介绍。 祝小伙伴早日学有所成。
Bean 元信息来源
- 资源:XML 或者 Properties(详情参考 PropertiesBeanDefinitionReader 中 javadoc)
- 注解:@Component 派生 和 @Bean 以及配置类等
- API:BeanDefinitionRegistry 和 SingletonBeanRegistry(详情参考 AbstractApplicationContext#prepareBeanFactory 方法)
Bean 元信息解析成 BeanDefinition 并注册
- 资源:BeanDefinitionReader 解析成 GenericBeanDefinition 并注册
- 注解:AnnotatedBeanDefinitionReader + ClassPathBeanDefinitionScanner 解析成 BeanDefinition 并注册
BeanDefinition 转变成 RootBeanDefinition(可选)
AbstractBeanFactory#doGetBean 调用 getMergedLocalBeanDefinition 方法
- 资源:非 RootBeanDefinition 转换成 RootBeanDefinition
- 注解:非 RootBeanDefinition 转换成 RootBeanDefinition
- API:非 RootBeanDefinition 转换成 RootBeanDefinition
Bean Class 加载
AbstractAutowireCapableBeanFactory#createBean(AbstractBeanFactory 中的模板方法) 调用 resolveBeanClass 方法
RootBeanDefinition 中 beanClass 是 Object 类型可能是 String 类型的类名称要么是类名称解析加载后的 Class 类型
Bean 实例化前置处理器
AbstractAutowireCapableBeanFactory#createBean(AbstractBeanFactory 中的模板方法) 调用 resolveBeforeInstantiation
调用 BeanFactory 中实现 InstantiationAwareBeanPostProcessor 接口中的 postProcessBeforeInstantiation 方法,如果有实例返回执行则调用 BeanFactory 中实现 BeanPostProcessor 接口中的 postProcessAfterInitialization方法。直接返回后面则不再执行。
Bean 实例化
AbstractAutowireCapableBeanFactory#doCreateBean 调用 createBeanInstance
- Java8 提供的 Supplier 函数式接口实例化
- 工厂方法
- 构造器
合并 Bean 定义处理器
AbstractAutowireCapableBeanFactory#doCreateBean 调用 applyMergedBeanDefinitionPostProcessors
调用 BeanFactory 中实现 MergedBeanDefinitionPostProcessor 接口中的 postProcessMergedBeanDefinition 方法,像 AutowiredAnnotationBeanPostProcessor(处理 @Autowired 和 @Value 注解) 和 CommonAnnotationBeanPostProcessor(处理 @Resource、@PreDestroy 和 @PostConstruct)就是找出要处理的注解