spring|Spring Boot 启动流程

1、spring boot 启动入口main方法 【spring|Spring Boot 启动流程】spring|Spring Boot 启动流程
文章图片

2、进入run() spring|Spring Boot 启动流程
文章图片

进入run()方法后看到new SpringApplication对象,点击进入SpringApplication的构造方法中
3、进入SpringApplication构造方法 spring|Spring Boot 启动流程
文章图片

  1. 容器初始化
    this.webApplicationType = WebApplicationType.deduceFromClasspath(); 进入该方法该静态体中通过ClassUtils.isPresent()方法通过fromName来判断常量中的类是否加载过,并根据加载的类来判断返回的容器类型。 webApplicationType对应的容器类型有三种如下: NONE :应用程序不作为web程序启动,不启动任何内嵌服务 SERVLET:应用程序以基于servlet的web应用启动,需要启动内嵌的servlet web服务 REACTIVE:应用程序以响应式web应用启动,需要启动内嵌的响应式的web服务

  2. 初始化spring.factories类
    setInitializers((Collection)getSpringFactoriesInstances(ApplicationContextInitializer.class)); setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));

扫描当前目录下的spring.factories文件并分别加载 ApplicationContextInitializer和ApplicationListener实现类
4.进入run()方法的实现
public ConfigurableApplicationContext run(String... args) { // 1、设置计时器 StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null; Collection exceptionReporters = new ArrayList<>(); //2、配置环境变量awt configureHeadlessProperty(); // 3、获取SpringApplicationRunListeners 监听器并执行 SpringApplicationRunListeners listeners = getRunListeners(args); listeners.starting(); try { // 4、将args封装成ApplicationArguments 对象 ApplicationArguments applicationArguments = new DefaultApplicationArguments(args); // 5、准备上下文环境 ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments); // 6、过滤掉不需要的bean configureIgnoreBeanInfo(environment); // 7、打印环境信息 Banner printedBanner = printBanner(environment); // 8、创建上下文 判断webApplicationType context = createApplicationContext(); // 9、获取异常监听 exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[] { ConfigurableApplicationContext.class }, context); // 10、准备上线文 prepareContext(context, environment, listeners, applicationArguments, printedBanner); // refreshContext(context); afterRefresh(context, applicationArguments); stopWatch.stop(); if (this.logStartupInfo) { new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch); } listeners.started(context); callRunners(context, applicationArguments); } catch (Throwable ex) { handleRunFailure(context, ex, exceptionReporters, listeners); throw new IllegalStateException(ex); }try { listeners.running(context); } catch (Throwable ex) { handleRunFailure(context, ex, exceptionReporters, null); throw new IllegalStateException(ex); } return context; }


    推荐阅读