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);
        }
    }
View Code

 

二、刷新上下文过程

// 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.解析扫描启动类

 

posted @ 2022-08-11 21:57  windge  阅读(154)  评论(0)    收藏  举报