当前位置 主页 > 网站技术 > 代码类 >

    SpringBoot启动应用及回调监听原理解析

    栏目:代码类 时间:2019-12-13 18:06

    这篇文章主要介绍了SpringBoot启动应用及回调监听原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    主类Main方法

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

    创建SpringApplication对象

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

    构造器

    public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
      this.sources = new LinkedHashSet();
      this.bannerMode = Mode.CONSOLE;
      this.logStartupInfo = true;
      this.addCommandLineProperties = true;
      this.addConversionService = true;
      this.headless = true;
      this.registerShutdownHook = true;
      this.additionalProfiles = new HashSet();
      this.isCustomEnvironment = false;
      this.lazyInitialization = false;
      this.resourceLoader = resourceLoader;
      Assert.notNull(primarySources, "PrimarySources must not be null");
      this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
      this.webApplicationType = WebApplicationType.deduceFromClasspath();
      this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
      this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
      this.mainApplicationClass = this.deduceMainApplicationClass();
    }

    ApplicationContextInitializer&ApplicationListener

    读取META-INF/spring.factories文件中的类 

    this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
    this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));

    执行run方法 

    public ConfigurableApplicationContext run(String... args) {
      StopWatch stopWatch = new StopWatch();
      stopWatch.start();
      // IOC容器
      ConfigurableApplicationContext context = null;
      Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList();
      this.configureHeadlessProperty();
      // 读取META-INF/spring.factories文件获得SpringApplicationRunListener的实现类集合
      SpringApplicationRunListeners listeners = this.getRunListeners(args);
      // 监听开始,回调所有SpringApplicationRunListener的starting()方法
      listeners.starting();
     
      Collection exceptionReporters;
      try {
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
        // 监听配置环境准备好了,回调所有SpringApplicationRunListener的environmentPrepared()方法
        ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
        this.configureIgnoreBeanInfo(environment);
        Banner printedBanner = this.printBanner(environment);
        // 创建IOC容器
        context = this.createApplicationContext();
        exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
        // 回调ApplicationContextInitializer的initialize()方法,回调SpringApplicationRunListener的contextPrepared()方法
        // 回调SpringApplicationRunListener的contextLoaded()方法
        this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
        // 刷新IOC容器,注入组件
        this.refreshContext(context);
        this.afterRefresh(context, applicationArguments);
        stopWatch.stop();
        if (this.logStartupInfo) {
          (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
        }
        // 回调SpringApplicationRunListener的started()方法
        listeners.started(context);
        // 从IOC容器中获得ApplicationRunner、CommandLineRunner的所有组件,回调ApplicationRunner、CommandLineRunner的run()方法
        this.callRunners(context, applicationArguments);
      } catch (Throwable var10) {
        this.handleRunFailure(context, var10, exceptionReporters, listeners);
        throw new IllegalStateException(var10);
      }
     
      try {
        // 回调SpringApplicationRunListener的running()方法
        listeners.running(context);
        return context;
      } catch (Throwable var9) {
        this.handleRunFailure(context, var9, exceptionReporters, (SpringApplicationRunListeners)null);
        throw new IllegalStateException(var9);
      }
    }