快速开发底层原理

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 默认读取配置文件,默认读取配置文件的路径为:

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐