zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    JS事件委托学习(转)
    js 监听监键盘动作(转)
    JS操作JSON总结
    靶机练习-VulnHub-Toopo
    Web安全测试学习笔记
    Web安全测试学习笔记
    PentesterLab练习
    CTF-攻防世界-supersqli(sql注入)
    工具学习
    漏洞复现-ElasticSearch 命令执行漏洞(CVE-2014-3120)
  • 原文地址:https://www.cnblogs.com/jatpeo/p/11767491.html
Copyright © 2011-2022 走看看