有效的输出是最好的输入。做一些简要的梳理
1、启动方式
触发spring容器启动的方式有多种。如web项目中通过servlet机制启动、main方法通过XmlBeanDefinitionReader或者ClassPathXmlApplicationContext启动、多线程中启动、springboot启动时触发容器的启动等。不在过多赘述。
常用的方式:
1)自己提供ApplicationContext自己创建Spring容器
AnnotationConfigApplicationContext、ClassPathXmlApplicationContext、FileSystemXmlApplicationContext。
2)Web项目中在web.xml中配置监听启动
org.springframework.web.context.ContextLoaderListener
2、启动主流程
2.1.在容器刷新之前会有一些前置工作。
如:AnnotationConfigApplicationContext会创建出DefaultListableBeanFactory
还有一些其他类的实例化和注册等处理,不是本文重点。
2.2.容器刷新流程
主要体现在AbstractApplicationContext的refresh()方法中。
每一个容器都会调用这个方法完成初始化,refresh()可划分为12个步骤。
1)刷新前的预处理 prepareRefresh
初始化一些属性设置;检验属性的合法等。
2)获取beanFactory obtainFreshBeanFactory
创建出DefaultListableBeanFactory。
对BeanFactory可以自定义扩展(customizeBeanFactory方法):
allowBeanDefinitionOverriding:是否允许覆盖同名称的不同定义的对象。
allowCircularReferences:是否允许bean之间的循环依赖。
3)BeanFactory的预准备工作 prepareBeanFactory
设置beanFactory需要的一些属性。
如:表达式解析器、属性注册编辑器、部分BeanPostProcessor、一些需要自动装配忽略的接口、一些需要的组件加入map中等等。
4)BeanFactory后置处理 postProcessBeanFactory
由子类实现,也是模版方法中钩子函数的一种体现吧。
5)执行工厂的后置处理 invokeBeanFactoryPostProcessors
6)注册Bean的后置处理器 registerBeanPostProcessors
获取所有的BeanPostProcessor,并根据优先规则排序后,添加到BeanFactory的beanPostProcessors集合中(一个CopyOnWriteArrayList)
7)初始化MessageSource组件 initMessageSource
做国际化功能;消息绑定;消息解析
8)初始化事件派发器 initApplicationEventMulticaster
创建ApplicationEventMulticaster,添加到BeanFactory中,方便后续事件机制等逻辑中使用。
9)onRefresh 给子类扩展一些自定义的逻辑实现。
10)注册并处理监听器 registerListeners
从容器中拿到所有的监听器(ApplicationListener)加入到事件派发器中,派发执行早期的一些事件(multicastEvent)。
11)初始化其他所有非懒加载单例bean finishBeanFactoryInitialization
主要包括解析bean,创建实例等一些逻辑处理。创建实例主要是通过getBean方法。会将一些创建的bean最终加到singletonObjects中,当然也包括解决循环依赖等一些经典的处理,后续再记录输出相关知识点。
12)finishRefresh
发布相应的事件、定义生命周期控制方法的接口(Lifecycle)等。
3.一点小结
1.Ioc最基本的技术是反射(Reflection)。
2.容器的自动注入由AutowiredAnnotationBeanPostProcess处理的,
Aop主要是在AnnotationAwareAspectJAutoProxyCreator中处理的。
由许多的后置处理器BeanPostProcessor一起实现了众多的功能,每个后置处理器都是在复用的基础上做扩展。
3.事件模型
ApplicationListener是事件监听器,ApplicationEventMulticaster是事件派发器。
4.用startupShutdownMonitor加锁,用于刷新和销毁的同步监视器。
记录几篇不错的博文
https://blog.csdn.net/huanglei_hacker/article/details/106458333
https://www.jianshu.com/p/927f24ceadfa
https://blog.csdn.net/ivan820819/article/details/79744797
https://blog.csdn.net/chr1sgong/article/details/79083770
https://blog.csdn.net/v123411739/article/details/99288413
https://juejin.cn/post/6906637797080170510