【SpringBoot】SpringBoot源码解析第一章 SpringBoot的构造方法-优快云博客
【SpringBoot】SpringBoot源码解析第二章 SpringBoot的run方法-优快云博客
【SpringBoot】SpringBoot源码解析第三章 SpringBoot的自动化配置_springboot源码配置-优快云博客
【SpringBoot】SpringBoot源码解析第四章 SpringBoot的bean接口-优快云博客
【SpringBoot】SpringBoot源码解析第五章 SpringBoot的beanDefinition收集过程-优快云博客
【SpringBoot】SpringBoot源码解析第六章 SpringBoot的getBean方法_springboot get bean-优快云博客
【SpringBoot】SpringBoot源码解析第七章 SpringBoot的感悟-优快云博客
上一章我们分析了SpringBoot的自动配置原理,这一章我们来分析SpringBoot的bean扩展接口
参考源码:<spring.boot.version>2.3.12.RELEASE</spring.boot.version>
目录
SpringBoot提供了众多扩展bean的接口,我们沿着bean的生命周期逐个分析它们执行的时机和使用的场景
1、BeanPostProcessor接口
BeanPostProcessor接口,又称为bean后置处理器,它包含初始化前置方法和初始化后置方法,允许在bean初始化前后加工bean,它的调用过程可以分为注册和调用两个阶段
1.1 注册
refresh方法调用registerBeanPostProcessors方法来注册bean后置处理器,在注册后置处理器的同时还会对它们排序
1. 实现PriorityOrdered接口
2. 实现Ordered接口
3. 实现MergedBeanDefinitionPostProcessor接口
4. 其它后置处理器
1.2 调用
refresh方法调用了finishBeanFactoryInitialization方法生成单例bean,并在初始化bean的前后执行bean后置处理器的两个方法
调用链
-> finishBeanFactoryInitialization
-> preInstantiateSingletons
-> getBean
-> doGetBean
-> createBean
-> doCreateBean
-> initializeBean
initializeBean方法会在调用invokeInitMethods方法的前后分别执行applyBeanPostProcessorsBeforeInitialization方法和applyBeanPostProcessorsAfterInitialization方法,这两个方法刚好对应了bean后置处理器的初始化前置方法和初始化后置方法
2、InitializingBean接口
InitializingBean接口为bean提供了初始化方法,它只有一个属性后置处理方法,它的调用时机就夹在bean后置处理器的两个方法之间,入口是invokeInitMethods方法
判断bean是否实现了InitializingBean接口,是的话就会调用afterPropertiesSet方法
3、BeanNameAware接口
BeanNameAware接口可以获取bean的名称,setBeanName方法接收的参数就是bean的名称,我们可以把它看做是一个在初始化节点暴露bean名称的方法
BeanNameAware接口的方法执行入口也是initializeBean方法
4、BeanFactoryAware接口
BeanFactoryAware接口可以获取beanFactory,获取到beanFactory就可以拿到其它的bean,它的执行时机在BeanNameAware接口之后
5、ApplicationContextAware接口
ApplicationContextAware接口可以获取到Spring容器的上下文环境,拿到上下文环境可以获取容器内的bean,它的执行时机和bean后置处理器有关
refresh方法调用prepareBeanFactory方法时,会往beanFactory内添加了一个ApplicationContextAwareProcessor后置处理器,这个后置处理器的初始化前置方法调用了invokeAwareInterfaces方法,如果bean实现了ApplicationContextAware接口,就会调用它的setApplicationContext方法
6、BeanFactoryPostProcessor接口
BeanFactoryPostProcessor接口提供的方法可以在bean工厂实例化bean之前对bean的生成材料beanDefinition进行修改,它和BeanPostProcessor的区别在于一个是操作beanDefinition,一个是操作bean
BeanFactoryPostProcessor接口方法的执行时机比上面列出接口方法都早。顾名思义,invokeBeanFactoryPostProcessors方法会调用BeanFactory后置处理器
7、总结
执行顺序:
BeanFactoryPostProcessor接口方法
BeanNameAware接口方法
BeanFactoryAware接口方法
ApplicationContextAware接口方法
BeanPostProcessor接口方法
InitializingBean接口方法(未编入方法)
下一章我们分析SpringBoot的beanDefinition收集过程
【SpringBoot】SpringBoot源码解析第五章 SpringBoot的beanDefinition收集过程-优快云博客