springboot源码分析
快速开发底层原理
SpringBoot核心理念
- 能够实现帮助开发者快速的整合第三方框架(Spring、Mybatis、hibernate)
原理:Maven依赖封装整合和自定义starter. - 完全去除XML配置,采用注解形式
原理:SpringBoot其实根据 Spring 体系原生的注解实现包装 - 不需要外部容器,内嵌入服务器(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启动总结
核心分为两个步骤:
- 创建 SpringApplication对象
- 调用SpringApplication run 实现启动同时返回当前的容器上下文
具体流程:
3. 创建 SpringApplication对象 Springboot 容器初始化操作
在SpringApplication的构造函数中获取当前应用启动类型 原理:判断当前classpath是否有加载我们的servlet类 返回servlet web启动方式
setInitializers 读取SpringBoot包下面的META-INF/spring.factories 获取到对应ApplicationContextInitializer 的实现类装配到集合(initializers)中
setListeners 读取SpringBoot包下面的META-INF/spring.factories 获取到对应ApplicationListener 的实现类装配到集合(listeners)中
mainApplicationClass 获取当前运行的主函数
调用SpringApplication run方法实现启动
StopWatch stopWatch = new StopWatch(); 记录我们SpringBoot项目启动时间
getRunListeners(args); 读取我们的ETA-INF/spring.factories SpringApplicationRunListeners 类型存入到集合中
listeners.starting(); 循环调用监听starting方法
ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);
listeners.environmentPrepared(environment);
利用 listeners 读取我们配置文件数据到SpringBoot容器中
Banner printedBanner = printBanner(environment); 打印我们SpringBoot Banner
创建SpringBoot上下文AnnotationConfigServletWebServerApplicationContext对象,根据 webApplicationType 创建对应的环境
refreshContext(context); 刷新我们上下文
开始创建我们的tomcat容器
run方法中的 refreshContext(context); 再到 applicationContext.refresh();
- 开始加载我们的SpringMVC
获取spring-boot-configurations下面的META-INF/ spring.factorie所有的类注册到IOC容器中。
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
配置类
afterRefresh 定义一个空的模版给其他子类实现重写
listeners.started(context); 使用广播和回调机制通知监听器已SpringBoot容器启动成功
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源码分析相关推荐
- SpringBoot源码分析(二)之自动装配demo
SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...
- Springboot源码分析第一弹 - 自动装配实现
Springboot就不用多了吧,解放Java开发双手的神器. 最显著的特点就是,去配置化,自动装配,自动配置.让开发人员只需要注重业务的开发 今天就来了解一下自动装配的源码是怎么实现的 预先准备 直 ...
- SpringBoot源码分析之内置Servlet容器
原文链接:http://fangjian0423.github.io/2017/05/22/springboot-embedded-servlet-container/ SpringBoot内置了Se ...
- Springboot源码分析之内嵌tomcat源码分析
Springboot源码是内嵌tomcat的,这个和完整的tomcat还是不同. 内嵌tomcat的源码在tomcat-embed-core等3个jar包里 展开tomcat-embed-core的c ...
- springboot源码分析之环境属性构造过程1
使用springboot的目的就是在项目开发中,快速出东西,因此springboot对于配置文件的格式支持是非常丰富的,最常见的配置文件后缀有如下四种:properties.xml.yml.yaml, ...
- springboot源码分析 - AbstractRoutingDataSource多数据源方案的分析
2019独角兽企业重金招聘Python工程师标准>>> 原本想用springboot+mybatis做多数据源的切换方案,想通过借鉴网上现有的方案,结果搜索后大量都是使用Abstra ...
- Springboot 源码分析 —— @Endpoint 注解生效原理解析
文章目录 1 WebMvcEndpointManagementContextConfiguration 1.1 webEndpointServletHandlerMapping 1.2 Control ...
- 深入浅出SpringBoot源码分析
Spring源码非常多,不要迷失在源码的汪洋大海里,抓住主要脉络,有需要再研究即可. Bean的初始化 1.发现所有的bean ComponentScanAnnotationParser.parse( ...
- SpringBoot源码分析之@Scheduled
Springboot写上注解@Scheduled就可以实现定时任务, 这里对其源码做一点分析 @Service public class MyScheduled {@Scheduled(cron=&q ...
最新文章
- C# winform中一个类中如何调用另一个窗体的控件或方法
- 使用控制结构——条件分支语句——简单条件
- 网络基础(二)及HTTP协议
- 整理iOS9适配中出现的坑
- 旅馆客未满 计算机术语,前厅测试题
- java Hello World程序分析(翻译自Java Tutorials)
- ubuntu命令行下中文乱码的解决方案
- onlyoffice添加中文字体及字号
- Latex 中的算法流程介绍,含中文和矩阵公式段落整体居中内部左对齐
- win10下pytorch 安装以及查看版本
- Android 2020年最新保活方案 保活90% 已适配8.0 ,9.0, 10.0(酷狗音乐)
- 电子血压仪器小程序开发制作
- G4560和G4600买哪个好?
- STM32cubeMX:双通道ADC(DMA)
- 2022年美国大学生数学建模(MCM/ICM)C题:量化交易策略
- Navicat for MySQL 连接 MySQL 报2005错误
- 牛逼了啊!用 JS 实现了识别网页验证码的功能!
- 论文阅读:FACIAL: Synthesizing Dynamic Talking Face with Implicit Attribute Learning
- 自动驾驶|苹果证实已收购自动驾驶初创公司Drive.ai 价格尚未披露
- C++ std::multiset返回值 has no member named ‘first’