欢迎光临
我们一直在努力

Spring源码 - 容器刷新

# 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,这里获取到的BeanFactoryDefaultListableBeanFactory。获取到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源码的笔记,鉴于本人技术有限,文中难免出现一些错误,感谢大家批评指正。

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《Spring源码 - 容器刷新》
文章链接:https://www.456zj.com/36396.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址