【Spring Boot入门(5)】:Spring Boot的主启动类是怎么运行的

414 阅读1分钟

主启动类:

上述代码将Springboot应用启动,springApplication类 run方法 这个类启动的时候开启了一个服务

package com.studymyself;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import javax.sound.midi.Soundbank;

@SpringBootApplication
public class BSpringbootAnnotationApplication {

    public static void main(String[] args) {
        //获取容器对象,即返回一个ConfigurableApplicationContext对象
        ConfigurableApplicationContext run = SpringApplication.run(BSpringbootAnnotationApplication.class, args);//参数1:应用入口的类	参数2:命令行参数

    }
}

SpringApplication.run()方法解析

分析该方法主要分两部分:一是SpringApplication的实例化,二是run方法的执行

SpringApplication这个类主要做了下面四个事情:

  • 推断这个应用类型是普通的项目还是Web项目
  • 查找并加载所有可使用的初始化器,设置到Initializers属性中
  • 找出所有的应用程序监听器,设置到listeners属性中
  • 推断并设置main方法的定义类,找到运行的主类(这里就是为什么运行run方法需要当前主类的Class对象作为参数的原因)
    • 如果不知道主类的话是无法加载的
    • RUN方法里面有一些监听器:这些监听器是全局存在的作用是:获取上下文处理一些Bean(组件)

SpringApplication类的实例化

一个构造器如下:

 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 = Collections.emptySet();
        this.isCustomEnvironment = false;
        this.lazyInitialization = false;
        this.applicationContextFactory = ApplicationContextFactory.DEFAULT;
        this.applicationStartup = ApplicationStartup.DEFAULT;
        this.resourceLoader = resourceLoader;
        Assert.notNull(primarySources, "PrimarySources must not be null");
        this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
        this.webApplicationType = WebApplicationType.deduceFromClasspath();//判断类型
        this.bootstrappers = new ArrayList(this.getSpringFactoriesInstances(Bootstrapper.class));
        this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));//初始化器
        this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));//监听器
        this.mainApplicationClass = this.deduceMainApplicationClass();//运行的主类	
    }

run方法

image.png