spring启动源码分析
初始化的核心流程图
从上图可知spring的初始化核心逻辑在org.springframework.context.support.AbstractApplicationContext#refresh方法中,调用栈:
1 | refresh:522, AbstractApplicationContext (org.springframework.context.support) |
refresh()方法的核心调用
- prepareRefresh();
- obtainFreshBeanFactory();
- prepareBeanFactory(beanFactory);
- postProcessBeanFactory(beanFactory);
- invokeBeanFactoryPostProcessors(beanFactory);
- registerBeanPostProcessors(beanFactory);
- initMessageSource();
- initApplicationEventMulticaster();
- onRefresh();
- registerListeners();
- finishBeanFactoryInitialization(beanFactory);
- finishRefresh();
下面我们一个一个方法做分析说明
prepareRefresh
方法代码并不长
1 | // 准备刷新,设置应用开启的时间还有active标志,并且执行一些属性源的初始化工作 |
startupDate 记录了context启动的时间。active与closed分别代表context是否激活与是否已经关闭的标识,他们都是AtomicBoolean类型的。initPropertySources()初始化了placeholder的属性,默认 do nothing ,方便扩展用的。validateRequiredProperties()校验了一些必要的属性,org.springframework.core.env.AbstractEnvironment#validateRequiredProperties
随后初始化了earlyApplicationEvents。
obtainFreshBeanFactory
创建并获取BeanFactory,此方法逻辑中会将所有配置中Bean的定义封装成BeanDefinition,并加载到新生成的BeanFactory中:
- beanDefinitionNames缓存:所有被加载到 BeanFactory 中的 bean 的 beanName 集合。
- beanDefinitionMap缓存:所有被加载到 BeanFactory 中的 bean 的 beanName 和 BeanDefinition 映射。
- aliasMap缓存:所有被加载到 BeanFactory 中的 bean 的 beanName 和别名映射。
1 | protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { |