SpringBoot启动加载流程

SringBoot启动类有两大核心:一个是注解@SpringBootApplication,一个是main方法里面的SpringApplication.run

1.通过main方法启动SpringBoot

public static void main(String[] args) {
        SpringApplication.run(StrayCatSpringbootApplication.class, args);
    }

2. 进入SpringApplication类run方法

3.run方法新建SpringApplication对象

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

 4.SpringApplication对象的run方法,首先创建并启动计时监控类

5.接着调用getRunListeners创建所有spring监听器

private SpringApplicationRunListeners getRunListeners(String[] args) {
        Class<?>[] types = new Class[]{SpringApplication.class, String[].class};
        return new SpringApplicationRunListeners(logger, this.getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args), this.applicationStartup);
    }
SpringApplicationRunListeners listeners = this.getRunListeners(args);

6.接着 DefaultApplicationArguments ,初始化应用参数

ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);

7.接着 prepareEnvironment 根据运行监听器和参数准备spring环境

ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);

 8.接着调用 createApplicationContext 方法创建应用上下文

protected ConfigurableApplicationContext createApplicationContext() {
        return this.applicationContextFactory.create(this.webApplicationType);
    }
 context = this.createApplicationContext();

 9.通过prepareContext准备应用上下文

this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);

 10.refreshContext 方法刷新上下文(通过spring ioc模板方法初始化)。

this.refreshContext(context);

11.调用stop方法停止计时监控器类

12.调用started分布执行所有runner运行器

listeners.started(context, timeTakenToStartup);

13.callableRunners 方法执行所有runner运行器

 private void callRunners(ApplicationContext context, ApplicationArguments args) {
        List<Object> runners = new ArrayList();
        runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
        runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
        AnnotationAwareOrderComparator.sort(runners);
        Iterator var4 = (new LinkedHashSet(runners)).iterator();

        while(var4.hasNext()) {
            Object runner = var4.next();
            if (runner instanceof ApplicationRunner) {
                this.callRunner((ApplicationRunner)runner, args);
            }

            if (runner instanceof CommandLineRunner) {
                this.callRunner((CommandLineRunner)runner, args);
            }
        }

    }
this.callRunners(context, applicationArguments);

14.调用 running 分布应用上下文就绪事件

15.最后返回应用上下文

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值