SpringBoot1.x之启动配置原理及自定义starter

1 启动配置原理

1.1 创建SpringApplication对象

    @SuppressWarnings({ "unchecked", "rawtypes" })
    private void initialize(Object[] sources) {
        //保存主配置类
        if (sources != null && sources.length > 0) {
            this.sources.addAll(Arrays.asList(sources));
        }
        //判断当前是否是一个web应用
        this.webEnvironment = deduceWebEnvironment();
        //从类路径下找到META‐INF/spring.factories配置的所有ApplicationContextInitializer然后保存起来
        setInitializers((Collection) getSpringFactoriesInstances(
                ApplicationContextInitializer.class));
        //从类路径下找到META‐INF/spring.factories配置的所有ApplicationListener然后保存起来
        setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
        //从多个配置类中找到有main方法的主配置类
        this.mainApplicationClass = deduceMainApplicationClass();
    }

1.2 运行run方法

    public ConfigurableApplicationContext run(String... args) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        ConfigurableApplicationContext context = null;
        FailureAnalyzers analyzers = null;
        configureHeadlessProperty();
        //获取SpringApplicationRunListeners,从类路径下找到META‐INF/spring.factories配置的所有SpringApplicationRunListeners
        SpringApplicationRunListeners listeners = getRunListeners(args);
        //回调所有的获取SpringApplicationRunListeners.starting();方法
        listeners.starting();
        try {
            //封装命令行参数
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(
                    args);
            //准备环境  创建环境完成后回调SpringApplicationRunListener的environmentPrepared()方法,表示环境准备完成
            ConfigurableEnvironment environment = prepareEnvironment(listeners,
                    applicationArguments);
            Banner printedBanner = printBanner(environment);
            //创建ApplicationContext,决定创建web的IOC容器还是普通的IOC容器
            context = createApplicationContext();
            analyzers = new FailureAnalyzers(context);
            //准备上下文环境
            //将environment保存到ioc容器中;
            //applyInitializers(context); 回调之前报错的所有的ApplicationContextInitializer的initialize方法
            //回调所有的SpringApplicationRunListener的contextPrepared()方法
            //listeners.contextLoaded(context);   回调所有的SpringApplicationRunListener的contextLoaded方法
            prepareContext(context, environment, listeners, applicationArguments,
                    printedBanner);
            //刷新容器:IOC容器初始化流程。
            refreshContext(context);
            //从IOC容器中获取所有的ApplicationRunner和CommandLineRunner进行回调
            //ApplicationRunner先回调
            //CommandLineRunner再回调
            afterRefresh(context, applicationArguments);
            //所有的SpringApplicationRunListene回调finished方法
            listeners.finished(context, null);
            stopWatch.stop();
            if (this.logStartupInfo) {
                new StartupInfoLogger(this.mainApplicationClass)
                        .logStarted(getApplicationLog(), stopWatch);
            }
            //整个SpringBoot应用启动完成以后返回IOC容器
            return context;
        }
        catch (Throwable ex) {
            handleRunFailure(context, listeners, analyzers, ex);
            throw new IllegalStateException(ex);
        }
    }
  • 总结:
  • ApplicationContextInitializer和SpringApplicationRunListener需要配置在META‐INF/spring.factories中。
  • ApplicationRunner和CommandLineRunner需要放在IOC容器中。

2 自定义starter

xx

原文地址:https://www.cnblogs.com/xuweiweiwoaini/p/12272538.html

时间: 2024-10-09 06:47:43

SpringBoot1.x之启动配置原理及自定义starter的相关文章

面试题: SpringBoot 的自动配置原理及定制starter

3.Spring Boot 的自动配置原理 package com.mmall; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] ar

Spring boot 启动配置原理

配置在META-INF/spring.factories 有几个主要的类 ApplicationContextInitializer    创建SpringAplication SpringApplicationRunListener 启动的run流程 ApplicationRunner CommandLineRunner 1:创建SpringApplication对象 initialize(sources); private void initialize(Object[] sources)

(七)SpringBoot启动配置原理

几个重要的事件回调机制 ApplicationContextInitializer SpringApplicationRunListener ApplicationRunner CommandLineRunner 启动流程 1.创建SpringApplication对象 1 initialize(sources); 2 private void initialize(Object[] sources) { 3 //保存主配置类 4 if (sources != null && source

springboot启动配置原理之二(运行run方法)

public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null; FailureAnalyzers analyzers = null; configureHeadlessProperty(); //获取SpringApplication

springboot核心技术(四)-----Docker、数据访问、自定义starter

Docker 1.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使 用这个镜像: 运行中的这个镜像称为容器,容器启动是非常快速的. 2.核心概念 docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上): docker客户端(Client):连接docker主机进行操作: docker仓库(Registry):用来保存各种打包好的软件

springboot(八) 嵌入式Servlet容器自动配置原理和容器启动原理

1.嵌入式Servlet容器自动配置原理 1.1 在spring-boot-autoconfigure-1.5.9.RELEASE.jar => springboot自动配置依赖 jar包下,EmbeddedServletContainerAutoConfiguration => 嵌入式servlet容器自动配置类 @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @Configuration @ConditionalOnWebApplicatio

ABP启动配置

ABP启动配置 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 本文由 东莞-天道 提供翻译 译者注:在看这一节的内容之前,建议大家先下载module-zero这个例子代码,这个例子就是一个用户和角色的模块,并且使用的实例.配置在每一个应用中都可能会有

基于DDD的现代ASP.NET开发框架--ABP系列之5、ABP启动配置

点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之5.ABP启动配置 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 本文由 东莞-天道 提供翻译 译者注:在看这一节的内容之前,建议大家先下载module-zero这

单Tomcat的多实例配置原理及应用

转自 http://www.cher7.com/?id=12919 我们常有在JAVAWeb应用部署或依赖Tomcat应用中遇到单机多实例的需求,解决方案一般有: 1.复制Tomcat到不同目录,更改Server.xml等配置文件: 2.部署不同应用实例到webapps目录下或直接将多项目部署到同一Tomcat实例中. 以此解决多项目部署问题,不能说以上两种解决方案不对,只是这种解决思路有以下几个问题: 复制多Tomcat难于维护.两三个实例还好说,如果配置十个以上的实例,那对于统一启动.Tom