3.Spring启动流程-obtainFreshBeanFactory
obtainFreshBeanFactory
前提说明在springboot的createApplicationContext的时候,BeanFactory已经创建完成了
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
this.refreshBeanFactory();
return this.getBeanFactory();
}
refreshBeanFactory是一个抽象方法,spring中两个类实现了这个方法
- AbstractRefreshableApplicationContext
- GenericApplicationContext
会走哪一个呢,看看类继承图吧
因为springboot创建的是一个AnnotationConfigServletWebServerApplicationContext
他的架构图如下
//—–
GenericApplicationContext和AbstractRefreshableApplicationContext
这里简要说明一下这两个类
AbstractApplicationContext是对ApplicationContext的一个简单抽象实现。
AbstractApplicationContext有两大子类GenericApplicationContext和AbstractRefreshableApplicationContext。
-
GenericApplictionContext
及其子类持有一个单例的固定的DefaultListableBeanFactory实例,在创建GenericApplicationContext实例的时候就会创建DefaultListableBeanFactory实例。
固定的意思就是说,即使调用refresh方法,也不会重新创建BeanFactory实例。 -
AbstractRefreshableApplicationContext
它实现了所谓的热刷新功能,它内部也持有一个DefaultListableBeanFactory实例,每次刷新refresh()时都会销毁当前的BeanFactory实例并重新创建DefaultListableBeanFactory实例。
1. refreshBeanFactory
GenericApplicationContext
protected final void refreshBeanFactory() throws IllegalStateException {
if (!this.refreshed.compareAndSet(false, true)) {
throw new IllegalStateException("GenericApplicationContext does not support multiple refresh attempts: just call "refresh" once");
} else {
this.beanFactory.setSerializationId(this.getId());
}
}
很简单设置个id而已
从这里也可以明显看出 不允许重新刷新
2.getBeanFactory
public final ConfigurableListableBeanFactory getBeanFactory() {
return this.beanFactory;
}
也很简单,返回了自己