spring容器的refresh方法分析

从这里进去:
在这里插入图片描述
进入到refresh方法中,有10几个子方法,一个个讲。
在这里插入图片描述
1.prepareRefresh,刷新前的准备工作,比如:设置容器启动时间,设置活跃状态为true,设置关闭状态为false,获取environment对象,并加载当前的属性值到environment对象中,准备监听器和事件的集合对象,默认为空的集合。

2.obtainFreshBeanFactory,主要是创建容器对象(DefaultListableBeanFactory),生成BeanDefination,这个时候DefaultListableBeanFactory中的beanDefinationMap和beanDefinationName当中会有值。这里会进行xml文件解析,bean标签解析,创建beanDefination对象。
在这里插入图片描述
在loadBeanDefinitions方法中主要是读取本地文件库(dtd,xsd),解析xml文件,并完成beanDefination的加载。
在这里插入图片描述
解析的过程还是比较复杂的。大概的意思就是通过spring.schemas下的xsd所对应的解析类去解析xml标签,比如说解析标签,解析完bean标签生成BeanDefination对象,并设置到beanFactory中的beanDefinationMap和beanDefinationNames中。
在这里插入图片描述
3.prepareBeanFactory(beanFactory),创建了beanfactory,但它当中很多属性都是为null,所以这个方法主要是对beanFactory属性进行填充。
在这里插入图片描述
4.postProcessBeanFactory(beanFactory),对bean工厂进行一些处理,比如添加beanFactoryPostProcess,由具体的子类去实现。

5.invokeBeanFactoryPostProcessors(beanFactory),调用执行各种beanFactory后置处理器。
在这里插入图片描述
6.registerBeanPostProcessors(beanFactory),注册BeanPostProcessor,只注册,不调用,等初始化的时候再调用。

7.initMessageSource,初始化MessageSource组件(做国际化功能;消息绑定,消息解析),这个接口提供了消息处理功能。主要用于国际化/i18n。

8.initApplicationEventMulticaster,多播器:方便后面发布监听事件。在Spring容器中初始化事件广播器,事件广播器用于事件的发布。程序首先会检查bean工厂中是否有bean的名字和这个常量(applicationEventMulticaster)相同的,如果没有则说明没有那么就使用默认的ApplicationEventMulticaster 的实现:SimpleApplicationEventMulticaster。

9.onRefresh,子类去实现。一个模板方法,不同的Spring容器做不同的事情。比如web程序的容器ServletWebServerApplicationContext中会调用createWebServer方法去创建内置的Servlet容器。目前SpringBoot只支持3种内置的Servlet容器:
1.Tomcat
2.Jetty
3.Undertow

10.registerListeners,注册应用的监听器。就是注册实现了ApplicationListener接口的监听器bean,这些监听器是注册到ApplicationEventMulticaster中的。这不会影响到其它监听器bean。在注册完以后,还会将其前期的事件发布给相匹配的监听器

11.finishBeanFactoryInitialization(beanFactory),实例化剩下的(非懒加载)单例。循环beanDefinationNames,通过beanName从BeanDefinationMap中拿到beanDefination,实例化bean的时候,我们先调用getBean(beanName)方法,从缓存中查,看缓存中有没有,如果没有,我们则要doCreateBean,doCreateBean通过反射调用bean的构造方法创建出bean,创建出来以后会放入到三级缓存当中,然后填充属性populateBean,填充完以后调用initializeBean方法初始化,这个方法里面看你是否实现了Aware接口,如果实现了就执行Aware接口方法,然后调用BeanPostProcessor:postProcessBeforeInitialization方法,接着执行init方法,然后再调用BeanPostProcessor:postProcessAfterInitialization方法,完成初始化,然后返回对象实例,把它设置到一级缓存当中。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
12.finishRefresh,完成context的刷新。主要是调用LifecycleProcessor的onRefresh()方法,并且发布事件(ContextRefreshedEvent)。
1.初始化生命周期处理器,并设置到Spring容器中(LifecycleProcessor)
2.调用生命周期处理器的onRefresh方法,这个方法会找出Spring容器中实现了SmartLifecycle接口的类并进行start方法的调用
3.发布ContextRefreshedEvent事件告知对应的ApplicationListener进行响应的操作

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值