IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring Boot 源码分析 - 运行过程 -> 正文阅读

[Java知识库]Spring Boot 源码分析 - 运行过程

执行入口 类 采用静态方法调用

SpringApplication.run(XXXApplication.class,args);

进入 SpringApplication

run(XXXApplication.class,args)

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

primarySource : 应用运行类 , 方法调用 内部 run 方法重载的 方法

最终 通过有参构造方法实例化 SpringApplication 对象,并调用 run 方法

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

该方法有两个 部分功能调用

new SpringApplication(primarySources)

这部分主要 有四部分功能

  1. 推断当前应用程序运行类型,并赋值给 webApplicationType 属性
  2. 加载项目jar类路径中的文件中 META-INF/spring.factories 中 包含ApplicationContextInitializer 的实现类 并实例化成对象,并存储到 initializers 数组属性中
  3. 加载项目jar类路径中的文件中 META-INF/spring.factories 中 包含ApplicationListener 的实现类 并实例化成对象,并存储到 initializers 数组属性中
  4. 推断当前应用程序main运行主类,并赋值给 mainApplicationClass 属性
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
   this.resourceLoader = resourceLoader;
   Assert.notNull(primarySources, "PrimarySources must not be null");
   this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
   this.webApplicationType = WebApplicationType.deduceFromClasspath();
   setInitializers((Collection) getSpringFactoriesInstances(
         ApplicationContextInitializer.class));
   setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
   this.mainApplicationClass = deduceMainApplicationClass();
}

getSpringFactoriesInstances

该方法 主要有二部分功能

  1. loadFactoryNames spring.factories文件加载 匹配 type 的类名称集合
  2. createSpringFactoriesInstances 根据 类名称集合 ,根据 构造函数反射 实例化类对象
private <T> Collection<T> getSpringFactoriesInstances(Class<T> type,
      Class<?>[] parameterTypes, Object... args) {
   ClassLoader classLoader = getClassLoader();
   // Use names and ensure unique to protect against duplicates
   Set<String> names = new LinkedHashSet<>(
         SpringFactoriesLoader.loadFactoryNames(type, classLoader));
   List<T> instances = createSpringFactoriesInstances(type, parameterTypes,
         classLoader, args, names);
   AnnotationAwareOrderComparator.sort(instances);
   return instances;
}

run(args)

  1. 配置 并准备 程序运行环境?
  2. 打印启动横幅
  3. 创建应用程序上下文 createApplicationContext();
    ?通过 webApplicationType 属性 实例化需要加载的 应用程序上下文类对象
  4. 配置程序运行环境

    configureHeadlessProperty(); Java 的Headless模式,Headless模式是在缺少显示屏、键盘或者鼠标是的系统配置

    getRunListeners(args); 获取程序运行监听器 加载项目jar类路径中的文件中 META-INF/spring.factories 中 包含SpringApplicationRunListener 的实现类 并实例化成对象,并存储到 initializers 数组属性中

    prepareEnvironment(listeners, applicationArguments); 配置 环境变量 ,通过 执行SpringApplicationRunListener environmentPrepared 事件, 加载 并实例化 META-INF/spring.factories EnvironmentPostProcessor PropertySourceLoader 接口实现类configureIgnoreBeanInfo(environment); 配置 需要忽略的bean 信息

  5. 加载并实例化 Spring Boot异常报告器
    ? ? ?获取程序运行监听器 加载项目jar类路径中的文件中 META-INF/spring.factories 中 包含SpringBootExceptionReporter的实现类 并实例化成对象,并存储到 initializers 数组属性中
  6. 准备应用程序上下文

    配置应用程序上下文环境

    配置后处理上下文 :注册内部配置Bean名称生成器 ,处理@Configuration 自定义名称;设置程序转换服务提供程序各类转换处理

    执行 ApplicationContextInitializer 的实现类 的初始化方法 initialize(context)

    添加 springApplicationArguments springBootBanner 单例到 bean 工厂ConfigurableListableBeanFactory

    加载bean 定义信息类 比如 解析@bean 注解的bean 、xml 配置bean 的定义读取类 ,先读取 启动类

  7. 刷新加载应用程序上下文
  8. 暴露提供子类实现类 在上下文刷新完成后进行干预操作 afterRefresh(context, applicationArguments);

? ? ? ? ? 提供 在上下文刷新 完 ,执行 某些操作 callRunners(context, applicationArguments); 提供 ApplicationRunner ApplicationRunner.class 、CommandLineRunner.class 两个功能函数类接口 (JDK 8)

public ConfigurableApplicationContext run(String... args) {
   StopWatch stopWatch = new StopWatch();
   stopWatch.start();
   ConfigurableApplicationContext context = null;
   Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
   configureHeadlessProperty();
   SpringApplicationRunListeners listeners = getRunListeners(args);
   listeners.starting();
   try {
      ApplicationArguments applicationArguments = new DefaultApplicationArguments(
            args);
      ConfigurableEnvironment environment = prepareEnvironment(listeners,
            applicationArguments);
      configureIgnoreBeanInfo(environment);
      Banner printedBanner = printBanner(environment);
      context = createApplicationContext();
      exceptionReporters = getSpringFactoriesInstances(
            SpringBootExceptionReporter.class,
            new Class[] { ConfigurableApplicationContext.class }, context);
      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;
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:18:51  更:2022-10-17 12:22:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/30 14:03:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码