广告
返回顶部
首页 > 资讯 > 精选 >Java SpringBoot核心源码的示例分析
  • 452
分享到

Java SpringBoot核心源码的示例分析

2023-06-22 06:06:08 452人浏览 泡泡鱼
摘要

本篇文章给大家分享的是有关Java SpringBoot核心源码的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。springBoot源码主线分析我们要分析一个

本篇文章给大家分享的是有关Java SpringBoot核心源码的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

    springBoot源码主线分析

    我们要分析一个框架的源码不可能通过一篇文章就搞定的,本文我们就来分析下SpringBoot源码中的主线流程。先掌握SpringBoot项目启动的核心操作,然后我们再深入每一个具体的实现细节,注:本系列源码都以SpringBoot2.2.5.RELEASE版本来讲解

    1.SpringBoot启动的入口

    当我们启动一个SpringBoot项目的时候,入口程序就是main方法,而在main方法中就执行了一个run方法。

    @SpringBootApplicationpublic class StartApp {public static void main(String[] args) {SpringApplication.run(StartApp.class);}}

    2.run方法

    然后我们进入run()方法中看。代码比较简单

    public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {// 调用重载的run方法,将传递的Class对象封装为了一个数组return run(new Class<?>[] { primarySource }, args);}

    调用了重载的一个run()方法,将我们传递进来的类对象封装为了一个数组,仅此而已。我们再进入run()方法。

    public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {// 创建了一个SpringApplication对象,并调用其run方法// 1.先看下构造方法中的逻辑// 2.然后再看run方法的逻辑return new SpringApplication(primarySources).run(args);}

    在该方法中创建了一个SpringApplication对象。同时调用了SpringApplication对象的run方法。这里的逻辑有分支,先看下SpringApplication的构造方法中的逻辑

    3.SpringApplication构造器

    我们进入SpringApplication的构造方法,看的核心代码为

    public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {// 传递的resourceLoader为nullthis.resourceLoader = resourceLoader;Assert.notNull(primarySources, "PrimarySources must not be null");// 记录主方法的配置类名称this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));// 记录当前项目的类型this.WEBApplicationType = WebApplicationType.deduceFromClasspath();// 加载配置在spring.factories文件中的ApplicationContextInitializer对应的类型并实例化// 并将加载的数据存储在了 initializers 成员变量中。setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));// 初始化监听器 并将加载的监听器实例对象存储在了listeners成员变量中setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));// 反推main方法所在的Class对象 并记录在了mainApplicationClass对象中this.mainApplicationClass = deduceMainApplicationClass();}

    在本方法中完成了几个核心操作

    推断当前项目的类型

    加载配置在spring.factories文件中的ApplicationContextInitializer中的类型并实例化后存储在了initializers中。

    和2的步骤差不多,完成监听器的初始化操作,并将实例化的监听器对象存储在了listeners成员变量中

    通过StackTrace反推main方法所在的Class对象

    上面的核心操作具体的实现细节我们在后面的详细文章会给大家剖析

    4.run方法

    接下来我们在回到SpringApplication.run()方法中。

    public ConfigurableApplicationContext run(String... args) {// 创建一个任务执行观察器StopWatch stopWatch = new StopWatch();// 开始执行记录执行时间stopWatch.start();// 声明 ConfigurableApplicationContext 对象ConfigurableApplicationContext context = null;// 声明集合容器用来存储 SpringBootExceptionReporter 启动错误的回调接口Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();// 设置了一个名为java.awt.headless的系统属性// 其实是想设置该应用程序,即使没有检测到显示器,也允许其启动.//对于服务器来说,是不需要显示器的,所以要这样设置.configureHeadlessProperty();// 获取 SpringApplicationRunListener 加载的是 EventPublishingRunListener// 获取启动时到监听器SpringApplicationRunListeners listeners = getRunListeners(args);// 触发启动事件listeners.starting();try {// 构造一个应用程序的参数持有类ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);// 创建并配置环境ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);// 配置需要忽略的BeanInfo信息configureIgnoreBeanInfo(environment);// 输出的Banner信息Banner printedBanner = printBanner(environment);// 创建应用上下文对象context = createApplicationContext();// 加载配置的启动异常处理器exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,new Class[] { ConfigurableApplicationContext.class }, context);// 刷新前操作prepareContext(context, environment, listeners, applicationArguments, printedBanner);// 刷新应用上下文 完成Spring容器的初始化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);}// 返回上下文对象--> Spring容器对象return context;}

    在这个方法中完成了SpringBoot项目启动的很多核心的操作,我们来总结下上面的步骤

    • 创建了一个任务执行的观察器,统计启动的时间

    • 声明ConfigurableApplicationContext对象

    • 声明集合容器来存储SpringBootExceptionReporter即启动错误的回调接口

    • 设置java.awt.headless的系统属性

    • 获取我们之间初始化的监听器(EventPublishingRunListener),并触发starting事件

    • 创建ApplicationArguments这是一个应用程序的参数持有类

    • 创建ConfigurableEnvironment这时一个配置环境的对象

    • 配置需要忽略的BeanInfo信息

    • 配置Banner信息对象

    • 创建对象的上下文对象

    • 加载配置的启动异常的回调异常处理器

    • 刷新应用上下文,本质就是完成Spring容器的初始化操作

    • 启动结束记录启动耗时

    • 完成对应的事件广播

    • 返回应用上下文对象。

    以上就是Java SpringBoot核心源码的示例分析,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

    --结束END--

    本文标题: Java SpringBoot核心源码的示例分析

    本文链接: https://www.lsjlt.com/news/303009.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Java SpringBoot核心源码的示例分析
      本篇文章给大家分享的是有关Java SpringBoot核心源码的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。SpringBoot源码主线分析我们要分析一个...
      99+
      2023-06-22
    • java编程Reference核心原理示例源码分析
      带着问题,看源码针对性会更强一点、印象会更深刻、并且效果也会更好。所以我先卖个关子,提两个问题(没准下次跳槽时就被问到)。 我们可以用ByteBuffer的allocateDirec...
      99+
      2022-11-13
    • Java SpringBoot核心源码详解
      目录SpringBoot源码主线分析1.SpringBoot启动的入口2.run方法3.SpringApplication构造器4.run方法总结SpringBoot源码主线分析 我...
      99+
      2022-11-12
    • JAVA核心知识之ConcurrentHashMap源码分析
      1 前言 ConcurrentHashMap是基于Hash表的Map接口实现,键与值均不允许为NULL,他是一个线程安全的Map。同时他也是一个无序的Map,不同时间进行遍历可能会得...
      99+
      2022-11-12
    • Druid核心源码分析DruidDataSource
      这篇“Druid核心源码分析DruidDataSource”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Druid核心源码分...
      99+
      2023-07-05
    • java线程池核心API源码详细分析
      目录概述源码分析ExecutorExecutorServiceScheduledExecutorServiceThreadPoolExecutorScheduledThreadPoo...
      99+
      2022-11-13
    • Spring AOP核心功能源码分析
      这篇“Spring AOP核心功能源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring A...
      99+
      2023-07-05
    • Java源码ConcurrentHashMap的示例分析
      小编给大家分享一下Java源码ConcurrentHashMap的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、记录形式打算直接把过程写在源码中,会按序进行注释,查阅的时候可以按序号只看注释部分二、Concur...
      99+
      2023-06-15
    • kafka核心消费逻辑源码分析
      本篇内容主要讲解“kafka核心消费逻辑源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“kafka核心消费逻辑源码分析”吧!消费逻辑框架搭建好之后着手开发下kafka的核心消费逻辑,流式图...
      99+
      2023-07-06
    • java中CopyOnWriteArrayList源码的示例分析
      这篇文章将为大家详细讲解有关java中CopyOnWriteArrayList源码的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。简介CopyOnWriteArrayList是ArrayList的...
      99+
      2023-06-29
    • Java中Handler源码的示例分析
      这篇文章主要介绍了Java中Handler源码的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。从很早开始就认识到 Handler 了,只不过那时修为尚浅,了解的不够深...
      99+
      2023-06-02
    • Java源码解析之ConcurrentHashMap的示例分析
      小编给大家分享一下Java源码解析之ConcurrentHashMap的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!早期 ConcurrentHashMap,其实现是基于:分离锁,也就是将内部进行分段(Segme...
      99+
      2023-06-15
    • vue组件三大核心的示例分析
      这篇文章主要介绍了vue组件三大核心的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、属性 1.自定义属性propsprop 定义...
      99+
      2022-10-19
    • 关于PHP核心功能的示例分析
      关于PHP核心功能的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。PHP是我们一直都很关注的语言之一,随着PHP6的升级,它的功能也越来越强大,我们这里...
      99+
      2023-06-17
    • 源码分析Vue3响应式核心之reactive
      目录一、Reactive源码1、reactive2、接着看工厂方法createReactiveObject二、baseHandlers1、baseHandlersvue3响应式核心文...
      99+
      2023-05-17
      Vue3响应式核心reactive Vue3响应式 reactive Vue3 reactive
    • 源码分析Vue3响应式核心之effect
      目录一、effect用法1、基本用法2、lazy属性为true3、options中包含onTrack二、源码分析1、effect方法的实现2、ReactiveEffect函数源码三、...
      99+
      2023-05-17
      Vue3响应式核心effect Vue3响应式effect Vue3 effect
    • laravel的核心实例分析
      本文小编为大家详细介绍“laravel的核心实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“laravel的核心实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。laravel的核心是服务容器,也就是...
      99+
      2023-06-29
    • PHP底层内核源码之变量的示例分析
      小编给大家分享一下PHP底层内核源码之变量的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!PHP变量的四个基本特征:1.变量命名变量命名上,PHP继承了P...
      99+
      2023-06-15
    • SpringBoot示例分析讲解自动化装配机制核心注解
      目录1. 自动化装配介绍2. Spring Boot 自动化配置UML图解3. Spring Boot 自动化配置核心注解分析3.1 @Inherited3.2 @SpringBoo...
      99+
      2022-11-13
    • Vue.use源码的示例分析
      这篇文章将为大家详细讲解有关Vue.use源码的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。先上vue.use源码// javascript的方法是可...
      99+
      2022-10-19
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作