深入理解SpringBoot核心机制《spring-boot-starter》
深入理解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》的更多相关文章
- SpringBoot 之Spring Boot Starter依赖包及作用
		
Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...
 - 最详细的自定义Spring Boot Starter开发教程
		
1. 前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世. 目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用 ...
 - 手把手教你定制标准Spring Boot starter,真的很清晰
		
写在前面 我们每次构建一个 Spring 应用程序时,我们都不希望从头开始实现具有「横切关注点」的内容:相反,我们希望一次性实现这些功能,并根据需要将它们包含到任何我们要构建的应用程序中 横切关注点 ...
 - 年轻人的第一个自定义 Spring Boot Starter!
		
陆陆续续,零零散散,栈长已经写了几十篇 Spring Boot 系列文章了,其中有介绍到 Spring Boot Starters 启动器,使用的.介绍的都是第三方的 Starters ,那如何开发一 ...
 - 手把手教你手写一个最简单的 Spring Boot Starter
		
欢迎关注微信公众号:「Java之言」技术文章持续更新,请持续关注...... 第一时间学习最新技术文章 领取最新技术学习资料视频 最新互联网资讯和面试经验 何为 Starter ? 想必大家都使用过 ...
 - Spring Boot Starter 和 ABP Module
		
Spring Boot 和 ABP 都是模块化的系统,分别是Java 和.NET 可以对比的框架.模块系统是就像乐高玩具一样,一块一块零散积木堆积起一个精彩的世界.每种积木的形状各不相同,功能各不相同 ...
 - Spring Boot Starter 介绍
		
http://www.baeldung.com/spring-boot-starters 作者:baeldung 译者:http://oopsguy.com 1.概述 依赖管理是任何复杂项目的关键部分 ...
 - spring -boot s-tarter 详解
		
Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合.你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符.例如,如果你想使用Sprin ...
 - Spring Boot (一): Spring Boot starter自定义
		
前些日子在公司接触了spring boot和spring cloud,有感于其大大简化了spring的配置过程,十分方便使用者快速构建项目,而且拥有丰富的starter供开发者使用.但是由于其自动化配 ...
 
随机推荐
- squid异常停止的排查步骤
			
今天重启squid的时候发现,squid启动后,status 一会就stop了 whoami@blackman:~/script/AutoProxy-master/main/server$ sudo ...
 - web浏览器知识点
			
网页是怎么形成的 前端的代码(英文字母)---->浏览器渲染 ------- > 客户眼中的效果 浏览器(显示代码) 游览器是网页显示,运行的平台,常用的的游览器有IE(Edge).火狐 ...
 - 开源爆款,阿里P7Android技术笔记,理论与实战齐飞,限时开放下载!
			
自我介绍 2013年java转到Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在. 被人面试过,也面试过很多人.深知大多数初中级Android工程师,想要 ...
 - Shell-06-正则表达式
			
正则表达式 shell正则表达式分为两种 基础正则表达式:BRE 扩展正则表达式:ERE,扩展的表达式有 + .? .| 和 () 元字符表 * 匹配0次或多次 更多请查看相关网站 http://ww ...
 - Java 多线程与并发【知识点笔记】
			
Java 多线程与并发[知识点笔记] Java多线程与并发 先说一下线程与进程的由来: 在初期的计算机,计算机只能串行执行任务,并且需要长时间的等待用户的输入才行 到了后来,出现了批处理,可以预先将用 ...
 - JVM-初见
			
目录 JVM的体系结构 类加载器 双亲委派机制 Native PC程序计数器 方法区(Method Area) 栈 堆 调优工具 常见JVM调优参数 常见垃圾回收算法 引用计数算法 复制算法 标记-清 ...
 - 基于kail的docker下安装sqli-labs
			
后面的关卡涉及到转码问题,比如空格,在Windows中会受到限制,比如24关的文件重命名问题,所以在这记录下在docker下安装sqli-labs,在linux下运行就不会受到限制. 参考链接:htt ...
 - 获取sim 卡的IMEI 和 IMSI
			
IReadOnlyList<string> networkAccIds = Windows.Networking.NetworkOperators.MobileBroadbandAccou ...
 - 演练:创建和使用自己的动态链接库 (C++)
			
此分布演练演示如何使用 Visual Studio IDE 通过 Microsoft C++ (MSVC) 编写自己的动态链接库 (DLL). 然后,该演练演示如何从其他 C++ 应用中使用 DLL. ...
 - git 拉取代码指定分支
			
问题背景: 新项目还在开发阶段,没有正式对外发布,所以开发同事合并代码到develop上(或者其他名称分支上),而不是到master分支上 通过git拉取代码的时候,默认拉取的是master分支,如下 ...