# my-note-spring **Repository Path**: too8g/my-note-spring ## Basic Information - **Project Name**: my-note-spring - **Description**: my-note-spring - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2020-05-28 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [Spring Framework 各版本文档](https://docs.spring.io/spring/docs/) # SpringBoot启动过程 一般写法:SpringApplication.run(XXXXApplication.class, args); SpringApplication.java(spring-boot.jar)(org.springframework.boot) 两个重载方法: ```$xslt ① ConfigurableApplicationContext run(Class primarySource, String... args) ② ConfigurableApplicationContext run(Class[] primarySources, String[] args) ``` 会调用: ```$xslt new SpringApplication(primarySources).run(args) ``` 下面就分为new SpringApplication()、run()两步来看 ## new SpringApplication() ```$xslt this.resourceLoader = null // 上面传入的主类集 this.primarySources = primarySources // 根据class判断web应用类型(REACTIVE、SERVLET、NONE),进而启动对应的内嵌web服务 this.webApplicationType = WebApplicationType.deduceFromClasspath(); // 关于getSpringFactoriesInstances // 1、SpringFactoriesLoader.loadFactoryNames // ① loadSpringFactories(classLoader) // 读取 META-INF/spring.factories,缓存并返回,下次同样的ClassLoad则从缓存取。缓存格式 Map[ClassLoad, Map[接口, List[实现类]] ] // ② 根据接口名,返回实现类名列表 // 2、createSpringFactoriesInstances 实例化那些实现类 // 3、AnnotationAwareOrderComparator.sort(instances) 实现类排序,用来支持“实现Ordered接口或@Order注解” // initializers = 【ApplicationContextInitializer】接口实现类的实例列表 setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class)); // listeners = 【ApplicationListener】接口实现类的实例列表 setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); // 找到main方法所在的类 // 通过抛出运行时异常然后抓堆栈信息,遍历判断main方法,然后返回类 // StackTraceElement[] stackTrace = new RuntimeException().getStackTrace(); // stackTraceElement.getMethodName() == main // 返回 stackTraceElement.getClassName() this.mainApplicationClass = deduceMainApplicationClass(); ``` 至此,SpringApplication初始化完成。 ## ConfigurableApplicationContext run(String... args) ```$xslt // Spring的一个工具类,以往看模块运行时间,要自己 endTime-startTime,格式也不好看 // stopWatch.start("task1"); doTask(); stopWatch.stop; stopWatch.start("task2"); doTask(); stopWatch.stop; // stopWatch.prettyPrint() 可以格式化的输出task的用时,很方便,平时自己也可以用 // 这里就是记录一下用时 StopWatch stopWatch = new StopWatch(); // 设置java.awt.headless,如果没有值,就设置成true。告诉程序,不要指望有鼠标键盘显示器。 configureHeadlessProperty(); // 通过getSpringFactoriesInstances加载所有 SpringApplicationRunListener,并启动 // 目前只有一个默认实现 EventPublishingRunListener // 也可以自己实现 SpringApplicationRunListener,然后放到 META-INF/spring.factories 里面 SpringApplicationRunListeners listeners = getRunListeners(args); listeners.starting(); // 用SimpleCommandLineArgsParser解析args ApplicationArguments applicationArguments = new DefaultApplicationArguments(args); // 1、根据web类型,创建 ConfigurableWebEnvironment。 servlet - StandardServletEnvironment,reactive - StandardReactiveWebEnvironment ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments); ```