我们还是从
SpringApplication.run(String... args) 看起。
我们进入
refreshContext(context) 方法体中:
很显然,核心方法还是去调用了 refresh(context):
继续进入
((AbstractApplicationContext) applicationContext).refresh():
方法注释:准备此上下文以进行刷新,设置其启动日期和活动标志以及执行属性源的任何初始化。
这个方法比较简单,做了两件事:
此方法,主要设置 从
obtainFreshBeanFactory()获取到的
beanFacotory的各种属性。
方法注释:配置工厂的标准上下文特征,例如上下文的ClassLoader和后处理器
此方法,做了以下几件事:
这里是一个空实现,留给子类重写。可以在 beanFactory 完成创建后做进一步设置。
对于 Servlet 而言,就是设置一些作用域之类的,例如 request、session 等。
这里的主要逻辑在
invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()):
这个方法体太长了,就不贴出来了。主要做了两件事:
调用
BeanDefinitionRegistryPostProcessor实现向容器内添加bean的定义。
其实这里我们在上一小节实践过了,下面就是我们添加的 Bean 。
调用
BeanFactoryPostProcessor实现向容器内添加bean的定义添加属性。
这个方法和
invokeBeanFactoryPostProcessors(beanFactory)是类似的。
找到BeanPostPocessor的实现,排序后注册进容器内。
主要是国际化、多语言配置。
不是重点,略过。
初始化事件广播器。监听器相关内容,我们之前已经学习过。此处也是类似的。
子类实现。Servlet 下主要表现为创建 web 容器。
我们知道
super.onRefresh()是空实现,所以直接看
createWebServer():
实例化BeanFactory 中已经被注册但是没被实例化的所有实例。
这是比较重要的 Bean 实例化流程。所以我们后面单开一节来学习。
所以,暂时不过多探究源码了。
此方法在 finally {} 中被调用,做一些清除缓存的工作。
至此,refresh 方法我们已经过了一遍。
这一小节,还是着重于 refresh 的总体流程。对于一些细节,留待以后慢慢学习,一口又吃不成个大胖子。
最近我整理了整套 《JAVA核心知识点总结》,说实话 ,作为一名Java程序员,不论你需不需要面试都应该好好看下这份资料。拿到手总是不亏的~我的不少粉丝也因此拿到腾讯字节快手等公司的Offer
进 【 Java进阶之路群】,找管理员获取哦-!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70000438/viewspace-2779258/ ,如需转载,请注明出处,否则将追究法律责任。