美文网首页
springboot启动简述

springboot启动简述

作者: 黑铁大魔王 | 来源:发表于2020-11-27 22:52 被阅读0次

启动一个springboot环境

完成了必要的依赖之后,只需要按照如下代码操作,就可以启动springboot了。
常规写法:

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

另一种写法:效果一样

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication();
        springApplication.run(args);
    }
}

稍微看一下源码,不深入

按照上面常规写法,进入run( ... )方法后,大致上有2个步骤
1. 执行public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources)构造器,源码注释如下:

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
        System.out.println("---------------- SpringApplication ----------------");
        this.resourceLoader = resourceLoader;
        Assert.notNull(primarySources, "PrimarySources must not be null");
        this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
        this.webApplicationType = WebApplicationType.deduceFromClasspath();
        // 设置Initializer, 在7里面会用到
        // 通过类加载器从META-INFO/spring.factories里找出所有的ApplicationContextInitializer.class对应的值,设置到Initializers里
        setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
        setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
        this.mainApplicationClass = deduceMainApplicationClass();
    }
  1. 执行run( ... )方法,源码如下
public ConfigurableApplicationContext run(String... args) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        ConfigurableApplicationContext context = null;
        Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
        configureHeadlessProperty();
        SpringApplicationRunListeners listeners = getRunListeners(args);
        listeners.starting(); // 1. 1个listener启动,问题:这1个listener是干什么的
        try {
            // 2. 这里可以解释:java -jar xxx.jar --spring.profiles.active=dev,为什么用--开头
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
            // 3. 从这里应该回去,准备环境的
            ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
            configureIgnoreBeanInfo(environment);
            // 4. 打印靴子吗?打印spring boot吗?
            Banner printedBanner = printBanner(environment);
            // 5. 生成哪种上下文,决定着是否会启动web容器
            context = createApplicationContext();
            // 6. 从spring.factories里获取信息,然后返回FailureAnalyzers对象
            exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
                    new Class[] { ConfigurableApplicationContext.class }, context);
            /* 7. 准备上下文
                7.1 设置context的conversionService为ApplicationConversionService
                7.2 调用Initializer的初始化方法,Initializer在SpringApplication构造函数里设置
                7.3 通过EventPublishingRunListener调用contextPrepared,策略模式
                7.4 直接把参数(applicationArguments, printedBanner)扔进spring容器(singletonObjects)里,applicationArguments对象里有 --spring.profiles.active=dev
                7.5 sources就是yml文件里配置的spring.main.sources
                7.6 加载spring.main.sources值的类
                7.7 EventPublishingRunListener里的contextLoaded方法
             */
            prepareContext(context, environment, listeners, applicationArguments, printedBanner);
            // 8. spring初始化,这里是spring framework的基础知识
            refreshContext(context); // 进入SpringFramework 12大护法里
            // 9. 该方法应该是个钩子,没有内容
            afterRefresh(context, applicationArguments);
            stopWatch.stop();
            if (this.logStartupInfo) {
                new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
            }
            // 10. EventPublishingRunListener里started方法
            listeners.started(context);
            // 11. 执行实现了CommandLineRunner,ApplicationRunner接口的类里的run方法
            callRunners(context, applicationArguments);
        }
        catch (Throwable ex) {
            // 12. 处理异常
            handleRunFailure(context, ex, exceptionReporters, listeners);
            throw new IllegalStateException(ex);
        }

好啦,简单吧。。。
未完待续。。。。。。

相关文章

  • springboot启动简述

    启动一个springboot环境 完成了必要的依赖之后,只需要按照如下代码操作,就可以启动springboot了。...

  • 45 springmvc和springboot的启动过程

    问题: 简述springmvc和springboot的启动过程 答案: springmvc的启动过程:首先,任何一...

  • 10)简述springboot启动流程

    springboot启动入口类:加载配置和启动 1.SpringBootApplication的背后 @Sprin...

  • SpringBoot启动源码解读

    最近看springBoot,研究一下springBoot启动源码 springboot启动 初始化SpringAp...

  • SpringBoot简述

    微服务:用特别小的代价启动一个功能,与传统启动不同,不需装Tomcat、打war包、部署等,类似windows下的...

  • SpringBoot(三):SpringBoot启动原理

    * 查看SpringBoot启动原理 1.SpringBoot启动入口 我们开发的任意一个项目,都有相同的启动入口...

  • springboot 启动分析四

    继续分析springboot的启动源码,承接上文springboot 启动分析三,本文主要分析applicatio...

  • Springboot启动原理

    Springboot是什么:SpringBoot=自动装配+外部化配置 启动方式:1,IDE启动;2,使用打包插件...

  • springboot 启动分析二

    承接上一篇启动分析一,继续学习springboot的启动原理,本文主要讲解springboot的事件发布 静态启动...

  • SpringBoot 源码分析

    SpringBoot通过内置的tomcat带动ioc容器的启动.下面通过源码分析SpringBoot的启动流程.首...

网友评论

      本文标题:springboot启动简述

      本文链接:https://www.haomeiwen.com/subject/ilifwktx.html