字段
refresh()
1. this.prepareRefresh();
这里的this是
不过super又会回到 AbstractApplicationContext
prepareRefresh()
没什么要特别注意的,都是保证运行成功的细节。
2. 对BeanFactory的一些准备工作
因为之后要进行一些对Bean的操作,工欲善其事必先利其器。
obtainFreshBeanFactory
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
this.refreshBeanFactory();
return this.getBeanFactory();
}
时刻注意这里的this指的是AnnotationConfigServletWebServerApplicationContext,Springboot 的整个启动过程其实就是围绕着创建好的容器,对这个容器的各种操作。
这里又用到了父类GenericApplicationContext的refreshBeanFactory方法,因为BeanFactory是父类私有的呢。
之后返回context所拥有的BeanFactory,这时的主角就是BeanFactory了,可以说refreshContext的意思就是让BeanFactory把该干的活给干了。
3. this.prepareBeanFactory()
工作前先进行完善工作,此时context所拥有的BeanFactory还有很多属性没有初始化为null
还是通过AbstractApplicationContext.prepareBeanFactory来完善,一目了然,都是对BeanFactory的属性进行初始化。
4. try{} 干活!
这大概是工程量最大,也是最核心的工作了。
4.1 this.postProcessBeanFactory(beanFactory);
终于AnnotationConfigServletWebServerApplicationContext自己要执行自己的方法了,开始自己的工作!
显然,AnnotationConfigServletWebServerApplicationContext用到了自己的两个工具类Reader和Scanner,但是这两个方法的作用是需要条件的。
分别是this.basePackages!=null 和!this.annotatedClasses.isEmpty())
这里两个方法没有执行
4.2 this.invokeBeanFactoryPostProcessors(beanFactory)
AbstractApplicationContext # invokeBeanFactoryPostProcessors(beanFactory)
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, this.getBeanFactoryPostProcessors()); 特别关键的一步,需要特别的类来实现。
这里用到新的类PostProcessorRegistrationDelegate