7_2.springboot2.x启动配置原理_2.运行run方法

当创建完SpringApplication对象之后运行run方法

public ConfigurableApplicationContext run(String... args) {
		StopWatch stopWatch = new StopWatch();
		stopWatch.start();
		ConfigurableApplicationContext context = null;
		Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
		configureHeadlessProperty();
		//获取SpringApplicationRunListener;;从类路径下META‐INF/spring.factories获取
		SpringApplicationRunListeners listeners = getRunListeners(args);
		//回调所有的获取SpringApplicationRunListener.starting()方法
		listeners.starting();
		try {
			//封装命令行参数
			ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
			//准备环境
			ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
			//创建环境完成后回调SpringApplicationRunListener.environmentPrepared();表示环境准备完成
			configureIgnoreBeanInfo(environment);
			//控制台打印图标
			Banner printedBanner = printBanner(environment);
			//创建ApplicationContext;决定创建web的ioc还是普通的ioc
			context = createApplicationContext();
			//异常的处理
			exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
					new Class[] { ConfigurableApplicationContext.class }, context);
			//准备上下文环境;将environment保存到ioc中;而且applyInitializers();
            //applyInitializers():回调之前保存的所有的ApplicationContextInitializer的initialize方法
            //回调所有的SpringApplicationRunListener的contextPrepared();
			prepareContext(context, environment, listeners, applicationArguments, printedBanner);
            //刷新容器;ioc容器初始化(如果是web应用还会创建嵌入式的Tomcat)
            //扫描,创建,加载所有组件的地方;(配置类,组件,自动配置)
			refreshContext(context);
            //从ioc容器中获取所有的ApplicationRunner和CommandLineRunner进行回调
            //ApplicationRunner先回调,CommandLineRunner再回调
			afterRefresh(context, applicationArguments);
			stopWatch.stop();
			if (this.logStartupInfo) {
				new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
			}
			listeners.started(context);
			callRunners(context, applicationArguments);
		}
		catch (Throwable ex) {
			handleRunFailure(context, ex, exceptionReporters, listeners);
			throw new IllegalStateException(ex);
		}

		try {
			listeners.running(context);
		}
		catch (Throwable ex) {
			handleRunFailure(context, ex, exceptionReporters, null);
			throw new IllegalStateException(ex);
		}
        //整个SpringBoot应用启动完成以后返回启动的ioc容器;
		return context;
	}

解析run方法部分代码:

1. prepareContext(context, environment, listeners, applicationArguments, printedBanner);

prepareContext(context, environment, listeners, applicationArguments, printedBanner)

将前面创建的SpringApplication对象中,从类路径下找到META‐INF/spring.factories配置的所有ApplicationContextInitializer的initialize方法

listeners.contextPrepared(context);
回调所有的SpringApplicationRunListener的contextPrepared();

prepareContext运行完成以后回调所有的SpringApplicationRunListener的contextLoaded();

 

posted @ 2019-10-07 18:22  杰醍奋  阅读(177)  评论(0编辑  收藏  举报