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实现 LeetCode 324 摆动排序 II
324. 摆动排序 II 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]- 的顺序. 示例 1: 输入: n ...
- SQL server 常用的数据库 DDL语言
use (数据库名) //切换到目标数据库 if exists (select * from sysdatabases where name='数据库名') //如果括号里面是查看有没有这个数据库 d ...
- 什么是 JVM ?
什么是 JVM ? 解析:不仅仅是基本概念,还有 JVM 的作用. 答:JVM,即 Java Virtual Machine,Java 虚拟机.它通过模拟一个计算机来达到一个计算机所具有的的计算功能. ...
- Linux 系统定时任务
crond服务管理与访问控制 启动 service crond restart 开机自启动 chkconfig crond on 用户的crontab设置 crontab [选项],其中 -e :编辑 ...
- PAT甲级 Reversible Primes
描述 A reversible prime in any number system is a prime whose "reverse" in that number syste ...
- 从零搭建Window前端开发环境
前言 作为一个小前端,是否因为搭建环境烦恼过,是否因为npm等国外镜像踩坑过,不要怕,接下来跟着我一步步搭建适合自己的开发环境吧!!! node 这个不用说了吧,我们经常和他打交道,无论是 gulp. ...
- LocalDateTime在项目中的使用(LocalDateTime对接前端通过时间戳互转、LocalDateTime对接数据库)
目录 1. 博客编写背景 2. LocalDateTime 前端交互 2.1 LocalDateTime 向前端写入时间戳 2.1.1 fastJson 默认的写入格式 2.1.2 更改 fastJs ...
- Vue中解决新脚手架3创建项目的移动端双击屏幕放大,双手拉动放大的方法
替换新版vue-cli创建项目的public>index.html <!DOCTYPE html> <html lang="en"> <head ...
- IP 代理池
https://github.com/jhao104/proxy_pool 安装依赖 pip install -r requirements.txt 配置 Config/setting.py # Co ...
- CentOS7——搭建LNMP环境(WordPress案例)
CentOS7--搭建LNMP环境(WordPress案例) LNMP组成介绍 LNMP(Linux-Nginx-MySQL-PHP)网站架构是目前国际流行的Web框架,该框架包括:Linux操作系统 ...