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知识库 -> springboot源码分析 -> 正文阅读

[Java知识库]springboot源码分析

快速开发底层原理

SpringBoot核心理念

  1. 能够实现帮助开发者快速的整合第三方框架(Spring、Mybatis、hibernate)
    原理:Maven依赖封装整合和自定义starter.
  2. 完全去除XML配置,采用注解形式
    原理:SpringBoot其实根据 Spring 体系原生的注解实现包装
  3. 不需要外部容器,内嵌入服务器(Tomcat) .
    原理:Java语言创建tomcat服务器,让后将本地class文件交给tomcat加载。
    案例:注解方式启动MVC将SpringMVC交给内部tomcat运行。,

内置tomcat原理

手动利用springmvc 实现不需要 tomcat 实现项目启动,仿 springboot项目,main方法启动项目。
在这里插入图片描述

starter基本思想

starter 其实就是springboot 对第三方常用框架组件的命名方式。

Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件)进行自动配置。使用者只需要依赖相应功能的Starter,无需做过多的配置和依赖,Spring Boot就能自动扫描并加载相应的模块。

starter命名是有规范:
如果是SpringBoot官方自定义Starter命名为

  • Spring-boot-starter-XX 官方.
  • mybatis-Spring-boot-starter 非官方的

自定义starter

1、新建项目
在这里插入图片描述

2、引入 maven 依赖

  <!--  自定义starter -->
    <dependencies>
        <!-- Compile dependencies -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <!--  能够让我们编写的配置文件在 其他人引用的时候有一定提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>
    </dependencies>

3、编写Java类

TokenAutoConfiguration

@Configuration
@EnableConfigurationProperties(TokenProperties.class)
public class TokenAutoConfiguration {

    @Bean
    public TokenService tokenService() {
        return new TokenService();
    }
}

TokenService

public class TokenService {

    @Autowired
    private TokenProperties tokenProperties;

    public String getToken() {
        System.out.println("模拟生成token");
        return tokenProperties.getTokenRedisHost() + "," + tokenProperties.getTokenRedisPwd();
    }
}

TokenProperties

@ConfigurationProperties(prefix = "kaico")
public class TokenProperties {
    private String tokenRedisHost;
    private String tokenRedisPwd;

    public void setTokenRedisHost(String tokenRedisHost) {
        this.tokenRedisHost = tokenRedisHost;
    }

    public void setTokenRedisPwd(String tokenRedisPwd) {
        this.tokenRedisPwd = tokenRedisPwd;
    }

    public String getTokenRedisHost() {
        return tokenRedisHost;
    }

    public String getTokenRedisPwd() {
        return tokenRedisPwd;
    }
}

spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.kaico.config.TokenAutoConfiguration

spring.factories 该文件作用:SPI 是 Java 提供的一种服务加载方式

4、将该jar包打入maven仓库中 mvn clean install

5、其他springboot 项目引入该jar包,在application 配置文件中配置 TokenProperties 类指定的两个参数,调用 TokenService 的方法时可以获取到这个参数。

SpringBoot源码深度解析

启动类源码分析

Springboot启动流程:
1、创建new SpringApplication
2、调用run方法
在这里插入图片描述SpringApplication 的构造方法
在这里插入图片描述获取当前启动环境,servlet运行、非servlet运行、响应式运行
在这里插入图片描述扫描每一个jar包,将需要加载的ApplicationContextInitializer类加入到initializers集合中去

在一个Springboot应用中,classpath上会包含很多jar包,有些jar包需要在
ConfigurableApplicationContext#refresh() 调用之前对应用上下文做一些初始化动作,因此它们会提供自己的ApplicationContextInitializer实现类,然后放在自己的META-INF/spring.factories 属性文件中,这样相应的ApplicationContextInitializer实现类就会被SpringApplication#initialize发现:

在这里插入图片描述


在这里插入图片描述
拿到启动类
在这里插入图片描述

WebApplicationType 的作用

在这里插入图片描述webApplicationType

  • NONE 不会嵌入我们的web服务器最终通过外部tomcat服务器
  • SERVLET需要使用servlet服务器运行
  • REACTIVE 使用响应式web启动

设置banner图

1、启动类设置,手动设置banner对象
在这里插入图片描述在这里插入图片描述
2、在src/mainlresouces下新建banner.txt,在文件中加入打印的信息,springboot默认加载resource下的banner.txt文件的内容
在这里插入图片描述读取resource 中的banner.txt 文件和配置的banner配置的图片路径或者默认resource 中banner命名的图片名称
在这里插入图片描述SpringbootApplication类中
在这里插入图片描述

SpringBoot加载配置原理

核心注解:@SpringBootApplication
在这里插入图片描述@EnableAutoConfiguration注解作用【加载第三方配置的启动类】,注入jar包中配置类到IOC容器中,也就是读取Springboot-autoconfigure jar包中 spring.factories中配置的109个类注册到IOC容器中去,但也不是所有的类都会注册进去,需要看你有没有引入对应的springboot依赖。和springMVC相关的 bean也注入到IOC容器中去了。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

内置Tomcat 源码分析

server 配置类
在这里插入图片描述
支持三种 web服务器:Tomcat、Jetty、Undertow
在这里插入图片描述默认创建Tomcat
在这里插入图片描述先创建tomcat,在启动SpringMVC容器。

SpringMVC 容器加载源码分析

springMVC配置文件
在这里插入图片描述创建DispatcherServlet注入到IOC容器
在这里插入图片描述

Springboot启动总结

核心分为两个步骤:

  1. 创建 SpringApplication对象
  2. 调用SpringApplication run 实现启动同时返回当前的容器上下文

具体流程:
3. 创建 SpringApplication对象 Springboot 容器初始化操作
在这里插入图片描述

  1. 在SpringApplication的构造函数中获取当前应用启动类型 原理:判断当前classpath是否有加载我们的servlet类 返回servlet web启动方式
    在这里插入图片描述

  2. setInitializers 读取SpringBoot包下面的META-INF/spring.factories 获取到对应ApplicationContextInitializer 的实现类装配到集合(initializers)中
    在这里插入图片描述

  3. setListeners 读取SpringBoot包下面的META-INF/spring.factories 获取到对应ApplicationListener 的实现类装配到集合(listeners)中
    在这里插入图片描述

  4. mainApplicationClass 获取当前运行的主函数
    在这里插入图片描述

  5. 调用SpringApplication run方法实现启动
    在这里插入图片描述

  6. StopWatch stopWatch = new StopWatch(); 记录我们SpringBoot项目启动时间

  7. getRunListeners(args); 读取我们的ETA-INF/spring.factories SpringApplicationRunListeners 类型存入到集合中
    在这里插入图片描述在这里插入图片描述

  8. listeners.starting(); 循环调用监听starting方法
    在这里插入图片描述

  9. ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);
    listeners.environmentPrepared(environment);
    利用 listeners 读取我们配置文件数据到SpringBoot容器中
    在这里插入图片描述

  10. Banner printedBanner = printBanner(environment); 打印我们SpringBoot Banner
    在这里插入图片描述

  11. 创建SpringBoot上下文AnnotationConfigServletWebServerApplicationContext对象,根据 webApplicationType 创建对应的环境
    在这里插入图片描述在这里插入图片描述

  12. refreshContext(context); 刷新我们上下文
    在这里插入图片描述

  13. 开始创建我们的tomcat容器
    run方法中的 refreshContext(context); 再到 applicationContext.refresh();
    在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述

  1. 开始加载我们的SpringMVC
    获取spring-boot-configurations下面的META-INF/ spring.factorie所有的类注册到IOC容器中。
    org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,
    org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\

配置类
在这里插入图片描述在这里插入图片描述

  1. afterRefresh 定义一个空的模版给其他子类实现重写

  2. listeners.started(context); 使用广播和回调机制通知监听器已SpringBoot容器启动成功

  3. listeners.running(context); 使用广播和回调机制通知监听器已SpringBoot容器启动成功running

listeners (监听器集合) 获取源码分析,作用:加载配置文件配置信息到springboot容器中。
![在这里插入图片描述](https://img-blog.csdnimg.cn/854613854927413fa101930546ec4589.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAa2FpY28yMDE4,size_20,color_FFFFFF,t_70,g_se,x_16

在这里插入图片描述

读取自定义配置文件到Springboot容器中

1、编写Java类,实现 SpringApplicationRunListener 接口,可以实现分布式配置中心读取配置信息
在这里插入图片描述2、通过在项目中的 resource下的 META-INF/spring.factories 文件中配置这个Java类就可以将这个Java类注入到SpringBoot容器中。
springboot 默认读取配置文件,默认读取配置文件的路径为:

在这里插入图片描述

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

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:43:57-

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