Spring Boot 启动应用原理

1.运行run方法

public ConfigurableApplicationContext run(String... args) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        ConfigurableApplicationContext context = null;
        FailureAnalyzers analyzers = null;
        this.configureHeadlessProperty();
        //获取SpringApplicationRunListeners;从类路径下META-INF/spring.factories
        SpringApplicationRunListeners listeners = this.getRunListeners(args);
        //回调所有获取SpringApplicationRunListeners .starting()方法,starting()方法内部遍历listener并调用starting()方法
        listeners.starting();

        try {
        //封装命令行参数
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
            //环境准备
            ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
            //环境准备完成后回调SpringApplicationRunListeners.penvironmentPrepared()方法,表示环境准备完成
            Banner printedBanner = this.printBanner(environment);
            //创建ApplicationContext,决定创建web的ioc还是普通的ioc
            //contextClass = Class.forName(this.webEnvironment ? "org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext" : "org.springframework.context.annotation.AnnotationConfigApplicationContext"); 
            //createApplicationContext()内部代码
            context = this.createApplicationContext();
            new FailureAnalyzers(context);
            //准备上下文环境,将environment保存到ioc中
            //回调之前的ApplicationContextInitalize的Initialize()方法
            //回调所有的SpringApplicationRunListener的contextLoaded()方法
            this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
            //刷新容器,ioc容器初始话
            this.refreshContext(context);
            //从ioc容器中获取所有的ApplicationRunner和CommandLineRunner进行回调
            //ApplicationRunner先回调,CommandlineRunner进行回调
            this.afterRefresh(context, applicationArguments);
            //所有的SpringApplicationRunListener回调finished方法
            listeners.finished(context, (Throwable)null);
            stopWatch.stop();
            if (this.logStartupInfo) {
                (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
            }
		//整个springboot应用启动完成后,返回ioc容器
            return context;	
        } catch (Throwable var9) {
            this.handleRunFailure(context, listeners, (FailureAnalyzers)analyzers, var9);
            throw new IllegalStateException(var9);
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_42424720/article/details/84346133