2022-08-30
原文作者:键盘林

分析IOC容器最主要的还是通过观察refresh()方法,在refresh是整个IOC容器的核心

202203062036342131.png

刷新前的预处理工作

202203062036361592.png

202203062036385833.png

if里面打印的是日志

202203062036403624.png

初始化属性配置

202203062036424745.png

进行属性校验

202203062036443166.png

保存事件

202203062036463447.png

获取bean工厂

202203062036484148.png

202203062036505629.png

2022030620365238910.png

进行BeanFactory的准备工作

2022030620365427911.png

2022030620365645812.png

BeanFactory 初始化之后进行的后置处理工作。

2022030620365903713.png

执行 BeanFactoryPostProcessor;BeanFactoryPostProcessor:beanFactory的后置处理器。在Bean Factory标准化初始化之后执行的

2022030620370123214.png

2022030620370352115.png

继续分析

2022030620370595816.png

2022030620370857217.png

2022030620371117918.png

2022030620371343419.png

2022030620371619920.png

按照类型获取所有的postProcessor组件

2022030620371832921.png

前面所讲的都是对bean factory的初始化处理,接下来分析对bean的处理

注册BeanPostProcessor(Bean的后置处理器)

2022030620372081022.png

注意:对于不同接口类型的BeanPostProcessor;在Bean创建前后的执行时机是不一样的

获取所有的BeanPostProcessor

2022030620372291523.png

对BeanPostProcessor进行校验

2022030620372517224.png

将初始化好的bean放入到beanFactory中

2022030620372782725.png

获取BeanFactory

看容器中是否存在Id为messageSource

如果有赋值给messageSource,如果没有自己创建DelegatingMessageSource;

2022030620372956926.png

把创建好的MessageSource注册在容器中,以后获取值的时候,直接可以自动注入MessageSource;

2022030620373200527.png

初始化事件派发器

2022030620373384828.png

获取工厂

2022030620373580229.png

onRefresh方法:初始化其他特定的beans在具体的context subClasses。

2022030620373845030.png

registerListeners():检查那个listener beans 和添加监听器

2022030620374052231.png

将ApplicationEvent多路派发出去

2022030620374239432.png

初始化所有剩下的bean

2022030620374431333.png

初始化所有剩下的单实例

2022030620374660234.png

具体的初始化操作

2022030620374815235.png

其内部初始化基本顺序:

2022030620375050736.png

最后一步完成IOC容器的创建工作。

2022030620375250437.png

总结:

1、Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息;

1)xml注册bean;

2)注解注册bean:@Service、@Component、@Bean、xxx

2、Spring容器会合适的时机创建这些bean

1)用到这个bean的时候,利用getBean创建bean;创建好以后保存在容器中;

2)统一创建剩下所有的bean的时候;finishBeanFactoryInitialization();

3)、后置处理器:beanPostProcessor

1)、每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能;

AutowiredAnnotationBeanpostProcessor:处理自动注入

AnnotationAwareAspectJAutoProxyCreator:来做AOP功能;

增强的功能注解:

AsyncAnnotationBeanPostProcessor

4)、事件驱动模式

ApplicationListener:事件监听;

ApplicationEvenMulticaster:事件派发

阅读全文