3.Spring启动流程-obtainFreshBeanFactory
< 返回列表时间: 2020-07-21来源:OSCHINA
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; }
也很简单,返回了自己
热门排行