乐趣区

关于springboot:81SpringBoot启动流程把spring应用跑起来

把 spring 利用跑起来

开始进入 run 办法:

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {return new SpringApplication(primarySources).run(args);
    }

step into run()

public ConfigurableApplicationContext run(String... args) {
        // 进行监听器,监控整个利用的启动和进行的
        StopWatch stopWatch = new StopWatch();
        //start 办法里的源码能够看上面代码展现
        stopWatch.start();// 记录利用的启动工夫
        // 创立疏导上下文(xxxContext 都是疏导环境)DefaultBootstrapContext bootstrapContext = createBootstrapContext();//createBootstrapContext 办法的源码在上面
        ConfigurableApplicationContext context = null;
        // 让以后利用进入 headless 模式。源码在上面
        //(headless 是自力更生的意思,不依赖他人)configureHeadlessProperty();
// 获取所有 RunListener(运行监听器)保留到 SpringApplicationRunListeners
//【为了不便所有 Listener 进行事件感知】所谓的监听器就是监听到以后我的项目的状态
        SpringApplicationRunListeners listeners = getRunListeners(args);
        //starting()源码剖析在上面
        listeners.starting(bootstrapContext, this.mainApplicationClass);
        try {
            // 筹备 ApplicationArguments 利用参数,利用参数是从命令行里传过来的。即保留命令行参数
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
            // 筹备运行时环境
            ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);// 这行代码完结后,所有的环境信息曾经准备就绪
            // 配置一些要疏忽的 bean 信息
            configureIgnoreBeanInfo(environment);
            // 打印 banner(banner 是啥,能够看上面)Banner printedBanner = printBanner(environment);
            // 创立 ioc 容器(容器创立实现后,所有的 bean 都会进去)context = createApplicationContext();// 源码在上面
            // 把 Startup 信息保存起来
            context.setApplicationStartup(this.applicationStartup);
            // 筹备 ioc 容器环境的信息(源码在上面)prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
            // 刷新 ioc 容器 (办法的源码在上面)
            refreshContext(context);
//=============== 到这里为止,ioc 容器就创立实现了 ==================
            
            // 容器刷新实现后要做的工作
            afterRefresh(context, applicationArguments);
            // 监听到容器全副启动实现
            stopWatch.stop();
            if (this.logStartupInfo) {new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
            }
            // 遍历所有监听器 调用 listeners.started(context); 
// 告诉所有的监听器 started 我的项目曾经启动了(告诉监听器又一个事干好了)所以在这里就能够拜访 8080 了
            listeners.started(context);
            // 调用所有 runners
            callRunners(context, applicationArguments);
        }
        catch (Throwable ex) {
            // 如果有异样,还会捕捉异样(捕捉源码在上面)handleRunFailure(context, ex, listeners);
            throw new IllegalStateException(ex);
        }

        try {// 没有任何异样就调用所有监听器的 running 办法  listeners.running(context); 
    // 告诉所有的监听器 running 我的项目曾经进入 running 状态了
            listeners.running(context);
        }
        catch (Throwable ex) {
            // 如果有异样,持续捕捉异样
            handleRunFailure(context, ex, null);
            throw new IllegalStateException(ex);
        }
        return context;
    }

banner:

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
(()\___ | '_ |'_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.4.0)

退出移动版