快速开发底层原理

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 {@Beanpublic TokenService tokenService() {return new TokenService();}
}

TokenService

public class TokenService {@Autowiredprivate 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 默认读取配置文件,默认读取配置文件的路径为:

springboot源码分析相关推荐

  1. SpringBoot源码分析(二)之自动装配demo

    SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...

  2. Springboot源码分析第一弹 - 自动装配实现

    Springboot就不用多了吧,解放Java开发双手的神器. 最显著的特点就是,去配置化,自动装配,自动配置.让开发人员只需要注重业务的开发 今天就来了解一下自动装配的源码是怎么实现的 预先准备 直 ...

  3. SpringBoot源码分析之内置Servlet容器

    原文链接:http://fangjian0423.github.io/2017/05/22/springboot-embedded-servlet-container/ SpringBoot内置了Se ...

  4. Springboot源码分析之内嵌tomcat源码分析

    Springboot源码是内嵌tomcat的,这个和完整的tomcat还是不同. 内嵌tomcat的源码在tomcat-embed-core等3个jar包里 展开tomcat-embed-core的c ...

  5. springboot源码分析之环境属性构造过程1

    使用springboot的目的就是在项目开发中,快速出东西,因此springboot对于配置文件的格式支持是非常丰富的,最常见的配置文件后缀有如下四种:properties.xml.yml.yaml, ...

  6. springboot源码分析 - AbstractRoutingDataSource多数据源方案的分析

    2019独角兽企业重金招聘Python工程师标准>>> 原本想用springboot+mybatis做多数据源的切换方案,想通过借鉴网上现有的方案,结果搜索后大量都是使用Abstra ...

  7. Springboot 源码分析 —— @Endpoint 注解生效原理解析

    文章目录 1 WebMvcEndpointManagementContextConfiguration 1.1 webEndpointServletHandlerMapping 1.2 Control ...

  8. 深入浅出SpringBoot源码分析

    Spring源码非常多,不要迷失在源码的汪洋大海里,抓住主要脉络,有需要再研究即可. Bean的初始化 1.发现所有的bean ComponentScanAnnotationParser.parse( ...

  9. SpringBoot源码分析之@Scheduled

    Springboot写上注解@Scheduled就可以实现定时任务, 这里对其源码做一点分析 @Service public class MyScheduled {@Scheduled(cron=&q ...

最新文章

  1. C# winform中一个类中如何调用另一个窗体的控件或方法
  2. 使用控制结构——条件分支语句——简单条件
  3. 网络基础(二)及HTTP协议
  4. 整理iOS9适配中出现的坑
  5. 旅馆客未满 计算机术语,前厅测试题
  6. java Hello World程序分析(翻译自Java Tutorials)
  7. ubuntu命令行下中文乱码的解决方案
  8. onlyoffice添加中文字体及字号
  9. Latex 中的算法流程介绍,含中文和矩阵公式段落整体居中内部左对齐
  10. win10下pytorch 安装以及查看版本
  11. Android 2020年最新保活方案 保活90% 已适配8.0 ,9.0, 10.0(酷狗音乐)
  12. 电子血压仪器小程序开发制作
  13. G4560和G4600买哪个好?
  14. STM32cubeMX:双通道ADC(DMA)
  15. 2022年美国大学生数学建模(MCM/ICM)C题:量化交易策略
  16. Navicat for MySQL 连接 MySQL 报2005错误
  17. 牛逼了啊!用 JS 实现了识别网页验证码的功能!
  18. 论文阅读:FACIAL: Synthesizing Dynamic Talking Face with Implicit Attribute Learning
  19. 自动驾驶|苹果证实已收购自动驾驶初创公司Drive.ai 价格尚未披露
  20. C++ std::multiset返回值 has no member named ‘first’

热门文章

  1. 开篇词 | 打通“容器技术”的任督二脉
  2. Es的针对于nested类型的多重子聚合
  3. Mysql(五)Mysql架构、数据库优化、主从复制
  4. STM32 LCD横竖屏
  5. java季度第一天_java获取某月,某季度的第一天和最后一天
  6. 安卓手机怎么恢复文件
  7. MATLAB | 如何自然好看的从图片中提取颜色并制作色卡
  8. 马拉松资讯获取及报名渠道分享
  9. MP4封装格式详解1
  10. “深度学习+图像算法”组合出击,看智能工业机器人如何击破3C电子产品检测难点