跟着小马哥学系列之 Spring IoC(源码篇:Bean 生命周期)

学成路更宽,吊打面试官。 ——小马哥

简介

大家好,我是小马哥成千上万粉丝中的一员!2019年8月有幸在叩丁狼教育举办的猿圈活动中知道有这么一位大咖,从此结下了不解之缘!此系列在多次学习极客时间《小马哥讲Spring核心编程思想》基础上形成的个人一些总结。希望能帮助各位小伙伴, 祝小伙伴早日学有所成。 分为基础篇、进阶篇、源码篇。玩游戏看颜色,学技术看版本,本系列以 Spring 5.2.2.RELEASE 版本为基础进行介绍。 祝小伙伴早日学有所成。

Bean 元信息来源

  1. 资源:XML 或者 Properties(详情参考 PropertiesBeanDefinitionReader 中 javadoc)
  2. 注解:@Component 派生 和 @Bean 以及配置类等
  3. API:BeanDefinitionRegistry 和 SingletonBeanRegistry(详情参考 AbstractApplicationContext#prepareBeanFactory 方法)

Bean 元信息解析成 BeanDefinition 并注册

  1. 资源:BeanDefinitionReader 解析成 GenericBeanDefinition 并注册
  2. 注解:AnnotatedBeanDefinitionReader + ClassPathBeanDefinitionScanner 解析成 BeanDefinition 并注册

BeanDefinition 转变成 RootBeanDefinition(可选)

AbstractBeanFactory#doGetBean 调用 getMergedLocalBeanDefinition 方法

  1. 资源:非 RootBeanDefinition 转换成 RootBeanDefinition
  2. 注解:非 RootBeanDefinition 转换成 RootBeanDefinition
  3. 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

  1. Java8 提供的 Supplier 函数式接口实例化
  2. 工厂方法
  3. 构造器

合并 Bean 定义处理器

AbstractAutowireCapableBeanFactory#doCreateBean 调用 applyMergedBeanDefinitionPostProcessors

调用 BeanFactory 中实现 MergedBeanDefinitionPostProcessor 接口中的 postProcessMergedBeanDefinition 方法,像 AutowiredAnnotationBeanPostProcessor(处理 @Autowired 和 @Value 注解) 和 CommonAnnotationBeanPostProcessor(处理 @Resource、@PreDestroy 和 @PostConstruct)就是找出要处理的注解

暴露早期 Bean 引用

Bean 实例化后置处理器

Bean 属性值赋值

Aware 接口回调

Bean 初始化前置处理器

Bean 初始化

Bean 初始化后置处理器

注册 Bean 销毁方法

Bean 使用

Bean 销毁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿大叔文海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值