SpringBoot启动源码及自定义starter
为什么springboot工程能够在mian方法中完成启动呢?
需要大家掌握的有几个点:
1、SPI
SPI在springboot中是去读取META-INF/spring.factories目录的配置文件内容,把配置文件中的类加载到spring容器中。这样如果你想把一个类加载到spring容器中,也可以采用这种方式来做。把类配置到spring.factories配置文件中即可。
那么我们总结一下,如果你想把一个类加载到spring容器中管理有几种方式:
1、通过xml的bean标签
2、通过加@Component注解被@ComponentScan扫描
3、通过在spring.factories配置该类
前两者是加载本工程的bean,扫描本工程的bean,第三点可以加载第三方定义的jar包中的bean,毕竟第三方jar包的包名跟本工程包名可能不一样,所以前两个方式扫描不到。
2、创建springboot的上下文对象

在这个上下文对象构造函数中把ConfigurationClassPostProcessor变成beanDefinition对象。
3、容器的启动


4、内置tomcat的启动和部署Tomcat的启动在onRefresh()中:

从源码我们看到,springboot的启动就是核心就是完成了两件事,一个是spring容器的启动调用了refresh核心方法,一个是tomcat的启动,new出了一个内置的tomcat。
自定义启动器
当公司里面需要把一些共用的api封装成jar包的时候,就可以尝试自定义启动器来做。
自定义启动器用到的就是springboot中的SPI原理,springboot会去加载META-INF/spring.factories配置文件。加载EnableAutoConfiguration为key的所有类。
利用这一点,我们也可以定义一个工程也会有这个文件。
1、定义启动器核心工程
工程结构


这个JackTemplate实例就是我们封装的通用API,其他工程可以直接导入jar使用的。
2、自定义starter
我们还会定义一个没代码的工程,在这个工程里面没有任何代码,只有一个pom文件。Pom里面就是对前面核心工程jar包的导入
工程结构:

3、自定义启动器使用
其实就只有在springboot工程pom文件里面导入依赖就可以了
这个依赖就是自定义starter哪个工程的maven坐标。

常用于抽取公共组件
SpringBoot启动源码及自定义starter的更多相关文章
- SpringBoot启动源码探究----configureHeadlessProperty()方法
该方法只做了一件事:设置了一个名为java.awt.headless的系统属性,源码如下: private void configureHeadlessProperty() { System.setP ...
- Springboot启动源码详解
我们开发任何一个Spring Boot项目,都会用到如下的启动类 @SpringBootApplication public class Application { public static voi ...
- SpringBoot启动源码探究---listeners.starting()
1.首先调用starting()方法,其内部是一个对所有listener的starting()调用的for循环,然后每个listener调用另一个starting方法,其内部调用multicastEv ...
- SpringBoot启动源码探究---getRunListener()
该方法目的是获取SpringApplicationRunListener getRunListener()-----调用----> getSpringFactoriesInstances()-- ...
- 【SpringBoot1.x】SpringBoot1.x 启动配置原理 和 自定义starter
SpringBoot1.x 启动配置原理 和 自定义starter 启动配置原理 本节源码 启动过程主要为: new SpringApplication(sources) 创建 SpringAppli ...
- spring-boot-2.0.3启动源码篇一 - SpringApplication构造方法
前言 spring-boot-2.0.3应用篇 - shiro集成,实现了spring-boot与shiro的整合,效果大家也看到了,工程确实集成了shiro的认证与授权功能.如果大家能正确搭建起来, ...
- spring-boot-2.0.3启动源码篇二 - run方法(一)之SpringApplicationRunListener
前言 Springboot启动源码系列还只写了一篇,已经过去一周,又到了每周一更的时间了(是不是很熟悉?),大家有没有很期待了?我会尽量保证启动源码系列每周一更,争取不让大家每周的期望落空.一周之中可 ...
- spring-boot-2.0.3启动源码篇四 - run方法(三)之createApplicationContext
前言 此系列是针对springboot的启动,旨在于和大家一起来看看springboot启动的过程中到底做了一些什么事.如果大家对springboot的源码有所研究,可以挑些自己感兴趣或者对自己有帮助 ...
- spring-boot-2.0.3启动源码篇三 - run方法(二)之prepareEnvironment
前言 此系列是针对springboot的启动,旨在于和大家一起来看看springboot启动的过程中到底做了一些什么事.如果大家对springboot的源码有所研究,可以挑些自己感兴趣或者对自己有帮助 ...
随机推荐
- Java实现蓝桥杯 历届试题 k倍区间
历届试题 k倍区间 时间限制:2.0s 内存限制:256.0MB 问题描述 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j) ...
- Java实现 蓝桥杯 算法训练 数字游戏
试题 算法训练 数字游戏 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个1-N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列 ...
- Java实现 蓝桥杯VIP 算法提高 数的划分
算法提高 数的划分 时间限制:1.0s 内存限制:256.0MB 问题描述 一个正整数可以划分为多个正整数的和,比如n=3时: 3:1+2:1+1+1: 共有三种划分方法. 给出一个正整数,问有多少种 ...
- Java实现奇偶数排序
1 问题描述 给定一个整数数组,请调整 数组中数的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分.要求时间复杂度为O(n). 2 解决方案 2.1 一头一尾指针往中间扫描法 pack ...
- python——公司年会抽奖小程序
张三科技有限公司有300名员工,开年会抽奖,奖项如下一等奖3名 : 泰国五日游二等奖6名 :iphone手机三等奖30名 :避孕套一盒规则:1.一共抽3次,第一次抽3等奖,第二次抽2等奖,第三次压轴抽 ...
- 深入理解JVM(③)判断对象是否还健在?
前言 因为Java对象主要存放在Java堆里,所以垃圾收集器(Garbage Collection)在对Java堆进行回收前,第一件事情就是要确定这些对象之中哪些还"存活"着,哪些 ...
- MySql多表查询优化
一.多表查询连接的选择 相信内连接,左连接什么的大家都比较熟悉了,当然还有左外连接什么的,基本用不上,我就补贴出来了,这个图只是让大家熟悉一下各种连接查询.然后要告诉大家的是,需要根据查询的信息,想好 ...
- pytorch入门2.2构建回归模型初体验(开始训练)
pytorch入门2.x构建回归模型系列: pytorch入门2.0构建回归模型初体验(数据生成) pytorch入门2.1构建回归模型初体验(模型构建) pytorch入门2.2构建回归模型初体验( ...
- 小师妹学JavaIO之:MappedByteBuffer多大的文件我都装得下
目录 简介 虚拟地址空间 详解MappedByteBuffer MapMode MappedByteBuffer的最大值 MappedByteBuffer的使用 MappedByteBuffer要注意 ...
- 【php】 jsonp转数组函数jsonp_decode
分享一个可以跟json一样用的函数jsonp_decode,能把jsonp格式数据转为php数组或对象. /** * 把jsonp转为php数组 * @param string $jsonp js ...