# Spring
源码 - 容器刷新
Spring
版本:5.3.13-release
1、控制反转:
- 将对象创建与对象之间的调用过程,全权交给
Spring
进行管理。
2、使用IOC
的目的:
3、IOC
是一种思想,DI
就是对IOC
的一种实现方式:
DI(Dependency Injection)
依赖注入:容器能知道哪个组件(类)运行的时候,需要另外一个类(组件);容器通过反射的形式,将容器中准备好的的Bean
实例对象注入(利用反射给属性赋值)到实例中去。
只要是容器管理的组件,都能使用容器提供的强大功能。
1、IOC
思想是基于IOC
容器完成,IOC
容器底层就是对象工厂。
2、Spring
提供IOC
容器实现的两种方式:
BeanFactory
接口:IOC
容器最基本的实现方式,是Spring
内部使用的接口,供Spring
内部使用。在加载配置文件的时候,不会去立即创建配置文件中配置的对象,而是在获取的或使用对象的时候创建对象。ApplicationContext
接口:BeanFactory
的子接口,提供了比BeanFactory
更强大的功能。加载配置文件的时候就创建配置文件中声明的对象。在实际开发中,开发人员一般都是实现ApplicationContextAware
接口,通过ApplicationContext
去获取容器中的Bean
。
Spring的容器刷新尤为重要,容器刷新的源码为AbstractApplicationContext#refresh()
。
AbstractApplicationContext#refresh()
源码:
@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh"); prepareRefresh(); ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); prepareBeanFactory(beanFactory); try { postProcessBeanFactory(beanFactory); StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process"); invokeBeanFactoryPostProcessors(beanFactory); registerBeanPostProcessors(beanFactory); beanPostProcess.end(); initMessageSource(); initApplicationEventMulticaster(); onRefresh(); registerListeners(); finishBeanFactoryInitialization(beanFactory); finishRefresh(); } catch (BeansException ex) { if (logger.isWarnEnabled()) { logger.warn("Exception encountered during context initialization - " + "cancelling refresh attempt: " + ex); } destroyBeans(); cancelRefresh(ex); throw ex; } finally { resetCommonCaches(); contextRefresh.end(); } } }
refresh()
中一共12个方法:
prepareRefresh()
: 准备刷新上下文环境。作用就是初始化一些状态和属性, 后后续的工作做准备。obtainFreshBeanFactory()
:字面意思是获取新鲜的BeanFactory
,这里获取到的BeanFactory
是DefaultListableBeanFactory
。获取到BeanFactory
之后ApplicationContext
就具备了BeanFactory
的各项功能,可以对Bean
进行各种基础操作。prepareBeanFactory()
:BeanFactory
的准备工作。对各种属性进行填充。postProcessBeanFactory()
:对获取的BeanFactory
做后置增强处理,默认没有实现,子类覆盖方法做额外处理。但是在WEB
中这里是有具体实现的。模板方法设计模式。invokeBeanFactoryPostProcessors()
:调用各种BeanFactory
增强处理器BeanFactoryPostProcessor
及其子接口BeanDefinitionRegistryPostProcessor
。注意,这里调用的各种BeanFactory
的增强处理器是在Bean
实例化之前。registerBeanPostProcessors()
:注册BeanPostProcessor
处理器。这里只是单纯的注册功能, 真正调用的是getBean()
方法。initMessageSource()
:为上下文初始化Message
源, 即不同语言的消息体做国际化处理。initApplicationEventMulticaster()
:初始化事件监听多路广播器。onRefresh()
:预留给子类, 用于初始化其他的 Bean。registerListeners()
:在所有注册的Bean
中查找listener beans
并注册到消息消息广播中。finishBeanFactoryInitialization()
:初始化剩下的单实例Bean
(非惰性)。finishRefresh()
:完成容器刷新。通知生命周期处理器lifecycle processor
刷新过程。同时发出ContextRefreshEvent
告知别人容器已完成刷新。
由于这里总共有12个方法,源码篇幅较多,所以分为以下12篇分析每个方法的源码。
GitHub源码地址:https://github.com/kapbc/kapcb-spring-source/tree/master/Spring-Framework-v5.3.13
备注:此文为笔者学习
Spring
源码的笔记,鉴于本人技术有限,文中难免出现一些错误,感谢大家批评指正。
- 海报