Spring-boot整体流程解析
解析源码版本:spring-boot-1.5.7.RELEASE,spring-framework-4.3.11.RELEASE
一、整体流程
1.初始化:初始化器和监听器
org.springframework.boot.SpringApplication#initialize
2.启动监听器
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting();
3.创建环境并载入配置
ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);
4.创建上下文(同时创建了beanFactory)
context = createApplicationContext();
5.准备上下文,注册bean定义
prepareContext(context, environment, listeners, applicationArguments,
printedBanner);
5.1 设置环境
context.setEnvironment(environment);
5.2 设置bean名称生成器、资源加载器
postProcessApplicationContext(context);
5.3 应用初始化器
applyInitializers(context);
5.4 广播事件:上下文准备完成
listeners.contextPrepared(context);
5.5 上下文载入资源(注册bean定义)
load(context, sources.toArray(new Object[sources.size()]));
5.6 广播事件:上下文加载完成
listeners.contextLoaded(context);
6.刷新上下文(注入bean)
refreshContext(context);
源码:org.springframework.boot.SpringApplication#run(java.lang.String...)
public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null; FailureAnalyzers analyzers = null; configureHeadlessProperty(); SpringApplicationRunListeners listeners = getRunListeners(args); // 2.启动监听器 listeners.starting(); try { ApplicationArguments applicationArguments = new DefaultApplicationArguments( args); // 3.创建环境并载入配置 ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments); Banner printedBanner = printBanner(environment); // 4.创建上下文(同时基类构造中创建了beanFactory) context = createApplicationContext(); analyzers = new FailureAnalyzers(context); // 5.准备上下文,注册bean定义 prepareContext(context, environment, listeners, applicationArguments, printedBanner); // 6.刷新上下文(注入bean) refreshContext(context); afterRefresh(context, applicationArguments); listeners.finished(context, null); stopWatch.stop(); if (this.logStartupInfo) { new StartupInfoLogger(this.mainApplicationClass) .logStarted(getApplicationLog(), stopWatch); } return context; } catch (Throwable ex) { handleRunFailure(context, listeners, analyzers, ex); throw new IllegalStateException(ex); } }
二、刷新上下文过程
// 6.1刷新前准备,比如重置状态、初始化属性 Prepare this context for refreshing.
prepareRefresh();
// 6.2获取刷新后的bean工厂,子类可扩展 Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 6.3用上下文、环境、内部核心bean等来初始化bean工厂 Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
// 6.4 添加bean的扩展处理 Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// 6.5 执行bean工厂的扩展处理器 Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// 6.6添加bean扩展处理器 Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// 6.7初始化messageSource Initialize message source for this context.
initMessageSource();
// 6.8初始化Application事件发布器 Initialize event multicaster for this context.
initApplicationEventMulticaster();
// 6.9初始化其他特殊的bean Initialize other special beans in specific context subclasses.
onRefresh();
// 6.10 注册监听器 Check for listener beans and register them.
registerListeners();
// 6.11 完成beanFactory初始化 Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// 6.12 完成刷新,发布完成事件 Last step: publish corresponding event.
finishRefresh();
源码:org.springframework.context.support.AbstractApplicationContext#refresh
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 6.1刷新前准备,比如重置状态、初始化属性 Prepare this context for refreshing.
prepareRefresh();
// 6.2获取刷新后的bean工厂,子类可扩展 Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 6.3用上下文、环境、内部核心bean等来初始化bean工厂 Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// 6.4 添加bean的扩展处理 Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// 6.5 执行bean工厂的扩展处理器 Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// 6.6添加bean扩展处理器 Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// 6.7初始化messageSource Initialize message source for this context.
initMessageSource();
// 6.8初始化Application事件发布器 Initialize event multicaster for this context.
initApplicationEventMulticaster();
// 6.9初始化其他特殊的bean Initialize other special beans in specific context subclasses.
onRefresh();
// 6.10 注册监听器 Check for listener beans and register them.
registerListeners();
// 6.11 完成beanFactory初始化 Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// 6.12 完成刷新,发布完成事件 Last step: publish corresponding event.
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
三、类图分析
1.整体过程

2.解析扫描启动类

浙公网安备 33010602011771号