【SpringBoot】SpringBoot源码解析第四章 SpringBoot的bean接口

e246a1dda09849a5a89535a62441565d.png

【SpringBoot】SpringBoot源码解析第一章 SpringBoot的构造方法-CSDN博客

【SpringBoot】SpringBoot源码解析第二章 SpringBoot的run方法-CSDN博客

【SpringBoot】SpringBoot源码解析第三章 SpringBoot的自动化配置_springboot源码配置-CSDN博客

【SpringBoot】SpringBoot源码解析第四章 SpringBoot的bean接口-CSDN博客

【SpringBoot】SpringBoot源码解析第五章 SpringBoot的beanDefinition收集过程-CSDN博客

【SpringBoot】SpringBoot源码解析第六章 SpringBoot的getBean方法_springboot get bean-CSDN博客

【SpringBoot】SpringBoot源码解析第七章 SpringBoot的感悟-CSDN博客

上一章我们分析了SpringBoot的自动配置原理,这一章我们来分析SpringBoot的bean接口

参考源码:<spring.boot.version>2.3.12.RELEASE</spring.boot.version>

目录

1、BeanPostProcessor接口

1.1  注册

1.2  调用

2、InitializingBean接口

3、BeanNameAware接口

4、BeanFactoryAware接口

5、ApplicationContextAware接口

6、BeanFactoryPostProcessor接口

7、总结

SpringBoot提供了众多扩展bean的接口,我们沿着bean的生命周期逐个解析每一个bean接口的执行时机和期望的效果

1、BeanPostProcessor接口

320e6a7cd5f646ca8bfe7ddfc46c1f09.png

BeanPostProcessor接口,又称为bean后置处理器,它包含初始化前置方法和初始化后置方法,允许在bean初始化前后进行额外的处理,它的调用过程可以分为注册和调用两个阶段

1.1  注册

119921cf4fe940c2aa954adda581d1eb.png

refresh方法调用registerBeanPostProcessors方法来注册bean后置处理器,在注册后置处理器的同时还会对他们进行排序

1. 实现PriorityOrdered接口
2. 实现Ordered接口
3. 实现MergedBeanDefinitionPostProcessor接口
4. 其它后置处理器

d887493405de40a6892bb8b8232fc00a.png

1.2  调用

refresh方法调用了finishBeanFactoryInitialization方法生成单例bean,并在初始化bean的前后执行bean后置处理器的两个方法

调用链
-> finishBeanFactoryInitialization
-> preInstantiateSingletons
-> getBean
-> doGetBean
-> createBean
-> doCreateBean
-> initializeBean

initializeBean方法会在调用invokeInitMethods方法的前后分别执行applyBeanPostProcessorsBeforeInitialization方法和applyBeanPostProcessorsAfterInitialization方法,这两个方法刚好对应了bean后置处理器的初始化前置方法和初始化后置方法

725b1e313eee4489acb067ef1e0701ad.png

1a2800ddcb8345238ef5a858b5835e3b.png

2d9eb34a7494433996c8b71fb0ec1b48.png

2、InitializingBean接口

f82d1f6ea6ce4802b6db32ada9422913.png

InitializingBean接口为bean提供了初始化方法,它只有一个属性后置处理方法,它的调用时机就夹在bean后置处理器的两个方法之间,入口是invokeInitMethods方法

94b8ccad9e7645d290831cd049c9ea68.png

判断bean是否实现了InitializingBean接口,是的话就会调用afterPropertiesSet方法

d56d54e7925745d6a4254d6edc42c0f9.png

3、BeanNameAware接口

BeanNameAware接口可以获取bean的名称,setBeanName方法的参数就是bean的名称,我们可以把它看做是一个在初始化节点暴露bean名称的方法

e0ea7fba7b864694b413cc028004d006.png

BeanNameAware接口的方法执行入口也是initializeBean方法

dca507246bf34ce38b0a6bd42d216a90.png

211759ba8ace4c979cfbb6d697d0baad.png

4、BeanFactoryAware接口

373ccc41d0784d7f9e26f5c6e5ef324b.png

BeanFactoryAware接口可以获取beanFactory,获取到beanFactory就可以拿到其它的bean,它的执行时机在BeanNameAware接口之后

1750208022ed4873b6362073d63ea0c5.png

5、ApplicationContextAware接口

dbb272e01ba7438c99c9522a9263e42a.png

ApplicationContextAware接口可以获取到Spring容器的上下文环境,拿到上下文环境可以获取容器内的bean,它的执行过程和bean后置处理器有关

c088bf24013041ebac512b0a0bb2e0d2.png

1a90e64107c745899741d6964817164d.png

refresh方法调用prepareBeanFactory方法时,会往beanFactory内添加了一个ApplicationContextAwareProcessor后置处理器,这个后置处理器的初始化前置方法调用了invokeAwareInterfaces方法,如果bean实现了ApplicationContextAware接口,就会调用它的setApplicationContext方法

200183f7c4874817821e33b8c95e5702.png

6、BeanFactoryPostProcessor接口

BeanFactoryPostProcessor接口提供的方法可以在bean工厂实例化bean之前对bean的生成材料beanDefinition进行修改,它和BeanPostProcessor的区别在于一个是操作beanDefinition,一个是操作bean

2132d155a67a4d639149375124451cc3.png

BeanFactoryPostProcessor接口方法的执行时机比上面列出接口方法都早。顾名思义,invokeBeanFactoryPostProcessors方法会调用BeanFactory后置处理器

75c97dfd12c0451aa98d83ad61570443.png

4f9a63d867a847d6b44061e82614849f.png

b440c9e2f2db404487852948ad21b52b.png

7、总结

执行顺序:

BeanFactoryPostProcessor接口方法

BeanNameAware接口方法

BeanFactoryAware接口方法

ApplicationContextAware接口方法

BeanPostProcessor接口方法

InitializingBean接口方法(未编入方法)

下一章我们分析SpringBoot的beanDefinition收集过程

【SpringBoot】SpringBoot源码解析第五章 SpringBoot的beanDefinition收集过程-CSDN博客

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值