3.Spring启动流程-obtainFreshBeanFactory

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;
    }

也很简单,返回了自己

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 3.Spring启动流程-obtainFreshBeanFactory