深入理解SpringBoot核心机制《spring-boot-starter》

前言

对于这几年java火爆天的springBoot我相信大家都有所使用过,在springBoot的项目中,pom文件引入最多的无非就是各种各样的srping-starter了。

什么是 Starter 呢?为什么要使用Starter呢?

你可以理解为一个可拔插式的插件(组件)。

通过 Starter,能够简化以前繁琐的配置,无需过多的配置和依赖,它会帮你合并依赖,并且将其统一集成到一个 Starter 中,我们只需在 Maven 或 Gradle 中引入 Starter 依赖即可。SpringBoot 会自动扫描需要加载的信息并启动相应的默认配置。

如果你想使用 redis 插件,你只需引入 spring-boot-starter-data-redis 即可;如果你想使用 mongodb,你只需引入 spring-boot-starter-data-mongodb 依赖即可。

springBoot-starter是一个集成接合器,完成两件事:

1、引入模块所需的相关jar包

2、自动配置各自模块所需的属性

SpringBoot 官方提供了大量日常企业应用研发各种场景的 spring-boot-starter 依赖模块。这些依赖模块都遵循着约定成俗的默认配置,并允许我们根据自身情况调整这些配置。



官方git地址:https://github.com/spring-projects/spring-boot/tree/2.5.x/spring-boot-project/spring-boot-starters

starter启动原理:

使用过springBoot项目的人应该都对@SpringBootApplication注解有所了解,那么我们看下源码:

@SpringBootApplication注解源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication 其中@EnableAutoConfiguration注解源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration

可以从源码看出关键功能是@Import注解导入自动配置功能类AutoConfigurationImportSelector类,主要方法getCandidateConfigurations()使用了SpringFactoriesLoader.loadFactoryNames()方法加载META-INF/spring.factories的文件(spring.factories声明具体自动配置)。

自定义starter:

Starter 命名规则

Spring 官方定义的 Starter 通常命名遵循的格式为 spring-boot-starter-{name},例如 spring-boot-starter-data-mongodb。

Spring 官方建议,非官方 Starter 命名应遵循 {name}-spring-boot-starter 的格式,例如,myjson-spring-boot-starter。

pom文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.11.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.duxn</groupId>
<artifactId>duxn-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>duxn-spring-boot-starter</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies> <!-- 设置deploy的地址 -->
<distributionManagement>
<snapshotRepository>
<id>maven-snapshots</id>
<name>user snapshot</name>
<url>maven仓库地址</url>
</snapshotRepository>
<repository>
<id>maven-releases</id>
<name>user release resp</name>
<url>maven仓库地址/</url>
</repository>
</distributionManagement> <build>
<finalName>${project.artifactId}-${project.version}</finalName> <plugins>
<!-- 跳过测试用例 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build> </project>

config配置如下:

public class BaseConfig {

    @ConfigurationProperties(prefix = "fulu")
@Data
public static class FuluConfig {
public String ichnbUrl = "可以设置默认值";
public Boolean isCache = true;//是否缓存
public Boolean isAuth = false;//是否校验身份信息
} @ConfigurationProperties(prefix = "jwt")
@Data
public static class JWTConfig {
public String issuer = "可以设置默认值"; public String url = "可以设置默认值";
} @ConfigurationProperties(prefix = "jwt.rpc")
@Data
public static class JWTRPCConfig {
public String secret = "可以设置默认值";
} @ConfigurationProperties(prefix = "oss")
@Data
public static class OSSConfig {
private String accessId = "可以设置默认值";
private String accessKey = "可以设置默认值";
private String endPoint = "可以设置默认值";
private String nameSpace = "可以设置默认值";
private String packages = "可以设置默认值";
} }

核心配置类:

@Configuration
@AutoConfigureOrder(Integer.MAX_VALUE)
@EnableAspectJAutoProxy(proxyTargetClass = true)
@ConditionalOnClass({HttpUtils.class})
@EnableConfigurationProperties({
BaseConfig.JWTConfig.class,
BaseConfig.JWTRPCConfig.class,
BaseConfig.FuluConfig.class,
BaseConfig.OSSConfig.class
})
@Slf4j
public class StarterConfiguration { @Resource
private BaseConfig.JWTConfig jwtConfig; @Resource
private BaseConfig.JWTRPCConfig jwtrpcConfig; @Resource
private BaseConfig.FuluConfig fuluConfig; @Resource
private BaseConfig.OSSConfig ossConfig; @Bean
public HttpUtils httpUtils() {
return new HttpUtils(redisTemplate, jwtConfig, jwtrpcConfig, fuluConfig);
} }

spring.factory配置:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.duxn.starter.config.StarterConfiguration

如需添加扫描可以在StarterConfiguration中注入@Bean或者直接在spring.factory追加扫描

假设扫描类需要添加构造入参则只能在StarterConfiguration中注入@Bean

此时一个spring-boot-starter已开发完毕。

使用方式:

pom文件引入

<dependency>
<groupId>com.duxn</groupId>
<artifactId>duxn-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency> yml文件配置
fulu:
ichnbUrl:
isCache:
isAuth:
jwt:
issuer:
rpc:
secret:
url:
oss:
accessId:
accessKey:
endPoint:
nameSpace:
packages:

至此:一个自己的starer已完成!

福禄·研发中心
福小雄

深入理解SpringBoot核心机制《spring-boot-starter》的更多相关文章

  1. SpringBoot 之Spring Boot Starter依赖包及作用

    Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...

  2. 最详细的自定义Spring Boot Starter开发教程

    1. 前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世. 目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用 ...

  3. 手把手教你定制标准Spring Boot starter,真的很清晰

    写在前面 我们每次构建一个 Spring 应用程序时,我们都不希望从头开始实现具有「横切关注点」的内容:相反,我们希望一次性实现这些功能,并根据需要将它们包含到任何我们要构建的应用程序中 横切关注点 ...

  4. 年轻人的第一个自定义 Spring Boot Starter!

    陆陆续续,零零散散,栈长已经写了几十篇 Spring Boot 系列文章了,其中有介绍到 Spring Boot Starters 启动器,使用的.介绍的都是第三方的 Starters ,那如何开发一 ...

  5. 手把手教你手写一个最简单的 Spring Boot Starter

    欢迎关注微信公众号:「Java之言」技术文章持续更新,请持续关注...... 第一时间学习最新技术文章 领取最新技术学习资料视频 最新互联网资讯和面试经验 何为 Starter ? 想必大家都使用过 ...

  6. Spring Boot Starter 和 ABP Module

    Spring Boot 和 ABP 都是模块化的系统,分别是Java 和.NET 可以对比的框架.模块系统是就像乐高玩具一样,一块一块零散积木堆积起一个精彩的世界.每种积木的形状各不相同,功能各不相同 ...

  7. Spring Boot Starter 介绍

    http://www.baeldung.com/spring-boot-starters 作者:baeldung 译者:http://oopsguy.com 1.概述 依赖管理是任何复杂项目的关键部分 ...

  8. spring -boot s-tarter 详解

    Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合.你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符.例如,如果你想使用Sprin ...

  9. Spring Boot (一): Spring Boot starter自定义

    前些日子在公司接触了spring boot和spring cloud,有感于其大大简化了spring的配置过程,十分方便使用者快速构建项目,而且拥有丰富的starter供开发者使用.但是由于其自动化配 ...

随机推荐

  1. 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了

    最近我们项目升级到了 Spring Boot 2.4.6 + Spring Cloud 2020.0.x,通过我的另一系列即可看出:Spring Cloud 升级之路.但是升级后,我们发现 Young ...

  2. SpringMVC学习09(文件的上传和下载)

    文件上传和下载 准备工作 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况 ...

  3. Python语言系列-05-模块和包

    自定义模块 #!/usr/bin/env python3 # author:Alnk(李成果) # 为什么要有模块?(内置函数不够用) # 和操作系统打交道 # 和python解释器打交道 # 和时间 ...

  4. 为什么有些容器在docker run的时候需要接 -it ,有些不需要?

    这是我们的Dockerfile文件 FROM busybox ENV sg WANG CMD ["/bin/sh", "-c", "echo wang ...

  5. docker 搭建kafka集群(入门版)

    1.环境 docker, docker-compose 2.zk-kafka.yml version: '3' services: zoo1: image: zookeeper:3.4.14 rest ...

  6. 一种简易但设计全面的ID生成器思考

    分布式系统中,全局唯一 ID 的生成是一个老生常谈但是非常重要的话题.随着技术的不断成熟,大家的分布式全局唯一 ID 设计与生成方案趋向于趋势递增的 ID,这篇文章将结合我们系统中的 ID 针对实际业 ...

  7. NOIP 模拟 $15\; \rm \text{玫瑰花精}$

    题解 \(by\;zj\varphi\) 一道线段树题目 这道题可以通过维护一棵线段树,线段树上的每个节点维护 \(\rm l,r,len,p\) 分别表示这段区间最左边的花精,最右边的花精,被两只花 ...

  8. NOIP 模拟 $12\; \text{简单的填数}$

    题解 一个纯的贪心,被我搞成 \(dp\) 了,最后把错解删掉了,骗了 \(10pts\) 考虑如何贪心,设置一种二元组 \((x,l)\),\(x\) 表示当前值,\(l\) 表示当前最长连续长度. ...

  9. Mysql生成UUID的SQL语句

    大写的UUID: SELECT UPPER(UUID()); 小写的UUID: SELECT LOWER(UUID()); SELECT UUID(); 去掉横杠的UUID: SELECT REPLA ...

  10. docker部署mysql5-7-31

    快速开始 docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql docker-compo ...