Spring容器启动主流程

本文详细介绍了Spring容器的启动方式,包括通过web.xml配置、main方法和Spring Boot等方式。核心关注点在于容器的刷新流程,从prepareRefresh到finishRefresh的12个步骤,涉及BeanFactory的创建、后置处理器的注册、初始化组件、事件派发等关键环节。此外,还提及了反射、自动注入、AOP和事件模型在Spring中的应用。
摘要由CSDN通过智能技术生成

有效的输出是最好的输入。做一些简要的梳理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值