SpringBoot 自定义 starter

 1. 官方文档

SpringBoot 版本 2.6.13,相关链接 Developing with Spring Boot

1.1 什么是 Starter

Starters are a set of convenient dependency descriptors that you can include in your application. You get a one-stop shop for all the Spring and related technologies that you need without having to hunt through sample code and copy-paste loads of dependency descriptors. For example, if you want to get started using Spring and JPA for database access,include the spring-boot-starter-data-jpa dependency in your project

The starters contain a lot of the dependencies that you need to get a project up and running quickly and with a consistent, supported set of managed transitive dependencies.

1.2 Starter 命名规范

  • 官方 starter:spring-boot-starter-*
  • 第三方 starter:*-spring-boot-starter

2. 自定义 starter

starter 最令人津津乐道的就是其自动配置特性,我们自定义一个 starter,演示一下该功能。我的上一篇博文,分析了 SpringBoot 的自动配置原理,有兴趣的小伙伴可以移步阅读。

2.1 相关代码准备

2.1.1 创建实体类 UserProperties
@Data
@ConfigurationProperties(prefix = "com.ys.prop")
public class UserProperties {private String version = "1.0";private User user;@Datapublic static class User {private String name;private Integer age;}
}
2.1.2 创建实体类 UserConfiguration
@Data
public class UserConfiguration {private UserProperties userProperties;public UserConfiguration(UserProperties userProperties) {this.userProperties = userProperties;}
}
2.1.3 创建配置类 TestAutoConfiguration
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(UserProperties.class)
public class TestAutoConfiguration {@Beanpublic UserConfiguration userConfiguration(UserProperties properties) {return new UserConfiguration(properties);}
}
2.1.4 创建文件 META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ys.starter.config.TestAutoConfiguration
2.1.5 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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ys</groupId><artifactId>test-spring-boot-starter</artifactId><version>1.0</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.6.13</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><version>2.6.13</version><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><skip>true</skip></configuration></plugin></plugins></build></project>
2.1.6 工程文件结构

2.2 打包部署

2.2.1 执行 mvn clean install,将项目打成 jar 包,部署到本地 maven 仓库

2.2.2 新建一个 Maven 工程,pom 文件添加相关依赖
<dependency><groupId>com.ys</groupId><artifactId>test-spring-boot-starter</artifactId><version>1.0</version>
</dependency>

2.3 现象演示

2.3.1 启动项目,运行 main 方法
@SpringBootApplication
public class BlogApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(BlogApplication.class, args);Object bean = context.getBean(TestAutoConfiguration.class);System.out.println(bean);}
}

通过日志,得出结论:自定义 starter 的自动配置生效

2.3.2 覆盖默认属性

在 test-spring-boot-starter 中 @EnableConfigurationProperties + @ConfigurationProperties 注解的组合使用,并且添加依赖 spring-boot-configuration-processor,我们可以在 idea 中根据提示覆盖默认属性,这也是 SpringBoot 一些自动配置类的常用套路,相关应用可以查看 WebMvcAutoConfiguration 的内部类 WebMvcAutoConfigurationAdapter

2.3.2.1 演示覆盖默认属性值
application.yaml 配置
com:ys:prop:version: 2.0user:name: annaage: 18
启动项目,运行 main 方法
@SpringBootApplication
public class BlogApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(BlogApplication.class, args);Object bean = context.getBean(UserConfiguration.class);System.out.println(bean);}
}

通过日志,得出结论:默认属性被覆盖

2.3.3 自动配置类一些特征

自动配置类一般都是以 AutoConfiguration 结尾,我们可以通过搜索  AutoConfiguration 来锁定相关类

2.4 扩展:解析以 .json 为后缀的配置文件

starter 可以扩展很多东西,我们不要陷入误区,认为 starter 等价于自动配置。下文将对自定义的 starter 进行扩展,让它可以解析以 .json 为后缀的配置文件

2.4.1 配置文件前置知识点
2.4.1.1 默认配置文件位置
  • optional:classpath:/
  • optional:classpath:/config/
  • optional:file:./
  • optional:file:./config/
  • optional:file:./config/*/
2.4.1.2 默认配置文件前缀
  • application
2.4.1.3 默认配置文件后缀
  • yml
  • yaml
  • properties
  • xml
2.4.1.4 默认配置文件

所以默认情况下,以下文件(文件在指定位置)都可以认为是配置文件:

  • application.yml
  • application.yaml
  • application.properties
  • application.xml

更多配置相关知识,可以移步相关博文:SpringBoot之外部化配置

2.4.2 让 SpringBoot 将 application.json 也当成配置文件解析
2.4.2.1 相关代码准备
2.4.2.1.1 创建工具类 JsonToPropertySourceConverter
public class JsonToPropertySourceConverter {public static PropertySource<?> convertJsonToPropertySource(String name, String json) {try {ObjectMapper objectMapper = new ObjectMapper();Map<String, Object> map = objectMapper.readValue(json, Map.class);return new MapPropertySource(name, map);} catch (Exception e) {throw new RuntimeException(e);}}
}
2.4.2.1.2 创建Loader JsonSourceLoader
public class JsonSourceLoader implements PropertySourceLoader {@Overridepublic String[] getFileExtensions() {return new String[]{"json"};}@Overridepublic List<PropertySource<?>> load(String name, Resource resource) throws IOException {List<PropertySource<?>> result = new ArrayList<>();if (resource == null || !resource.exists()) {return result;}ByteArrayOutputStream bao = new ByteArrayOutputStream();try (InputStream in = resource.getInputStream()) {IOUtils.copy(in, bao);}String json = new String(bao.toByteArray(), StandardCharsets.UTF_8);PropertySource<?> propertySource = JsonToPropertySourceConverter.convertJsonToPropertySource(resource.getFilename(), json);result.add(propertySource);return result;}
}
2.4.2.1.3 在 spring.factories 中添加 key 为 PropertySourceLoader 的配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ys.starter.config.TestAutoConfigurationorg.springframework.boot.env.PropertySourceLoader=\
com.ys.starter.loader.JsonSourceLoader
2.4.2.1.4 重新打包部署 test-spring-boot-starter

执行命令 mvn clean install

2.4.2.2 现象演示
2.4.2.2.1 创建文件 application.json

在依赖 test-spring-boot-starter.jar 的项目里创建文件 application.json,文件明细如下:

{"my.starter.key": "666"
}
2.4.2.2.2 启动项目,运行 main 方法
@SpringBootApplication
public class BlogApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(BlogApplication.class, args);String property = context.getEnvironment().getProperty("my.starter.key");System.out.println(property);}
}

通过日志,得出结论:成功获取到属性 my.starter.key 的值,即 application.json 被当成配置文件解析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/400940.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++哪些变量在没有显式初始化的情况下会被初始化为0

首先&#xff0c;我们需要明白C程序编译链接后会包含以下几个主要段(Section)。 代码段(.text)&#xff1a;存放程序的可执行代码&#xff0c;通常是只读的数据段(.data)&#xff1a;存放已初始化的全局变量和静态变量BSS段(.bss)&#xff1a;存放未初始化的全局变量和静态变量…

Git文件管理技巧:轻松删除与查看文件,忽略不必要的文件与文件夹!

避免文件混乱&#xff1a;Git 文件操作技巧 一、Git工作原理概述二、删除文件三、查看指定文件的修改四、指定不需要 Git 管理的文件五、总结 一、Git工作原理概述 Git是一种分布式版本控制系统&#xff0c;其核心在于其高效的快照机制、强大的分支与合并功能、本地开发的灵活…

详细分析JWT的基本知识(附Demo)

目录 前言1. 基本知识2. JWT验证过程3. Demo 前言 对于Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 紧凑的、U…

《Kotlin核心编程》2021版复习记录

目录 0 前言1 基础语法1.1 数据类型1.2 数组1.3 集合1.4 遍历数据和集合1.5 函数声明返回值类型1.6 var 和 val 2 高阶函数和lambda表达式2.1 高阶函数2.2 方法和成员引用2.3 链式调用2.4 扩展函数2.5 面向表达式编程2.5.1 when表达式2.5.2 for循环2.5.3 in 2.6 字符串相等 3 面…

手撕初阶数据结构之---排序

1.排序概念及运用 排序&#xff1a;所谓排序&#xff0c;就是使⼀串记录&#xff0c;按照其中的某个或某些关键字的⼤⼩&#xff0c;递增或递减的排列起来的操作。 常见的排序算法 直接插入排序的时间复杂度是O(N^2) 这个是最差的情况下&#xff0c;就是大的在前面&#xff…

被老韭菜阴阳了?未来一个人最核心的能力:守脑如玉——早读(逆天打工人爬取热门微信文章解读)

tomato 版本TO&#xff1f; 引言Python 代码第一篇 洞见 未来一个人最核心的能力&#xff1a;守脑如玉第二篇 股友见闻结尾 &#xff08;你看出本质了吗&#xff1f;&#xff09; 引言 昨晚听别人的分析 好神奇 我会惊叹 为什么大家看到的都是同样的东西 而别人进行思考 思考…

Python 在PDF中添加条形码、二维码

在PDF中添加条码是一个常见需求&#xff0c;特别是在需要自动化处理、跟踪或检索PDF文件时。作为一种机器可读的标识符&#xff0c;PDF中的条码可以包含各种类型的信息&#xff0c;如文档的唯一标识、版本号、日期等。以下是一篇关于如何使用Python在PDF中添加条形码或二维码的…

Python开源项目周排行 2024年第13周

#2024年第13周2024年8月5日1roop一款基于深度学习框架TensorFlow和Keras开发的单图换脸工具包&#xff0c;提供了丰富的功能和简洁易用的界面&#xff0c;使得用户可以轻松实现单图换脸操作。支持多张人脸替换成同一个人脸&#xff0c;勾选多人脸模式即可 人脸替换 高清修复自…

SPDK源码剖析一hello_world程序

SPDK初识之hello_world程序分析 首先是hello_world程序整体框架分析 int main(int argc, char **argv) {rc parse_args(argc, argv, &opts);if (spdk_env_init(&opts) < 0) { // spdk环境初始化&#xff0c;最终调用dpdk环境初始化}// 扫描设备&#xff0c;将驱…

bluecmsphp代码审计

bluecms代码审计 (一) 运行环境需求&#xff1a; 可用的 httpd 服务器&#xff08;如 Apache、Zeus、IIS 等&#xff09; PHP 4.3.0 及以上 MySQL 4.1 及以上配置文件审计 看到uploads/install/include/common.inc.php 当然我们可能自己根本不知道那个是重要的文件&#x…

C++《类和对象》(上)

在之前的C入门基础知识中我们了解了C的发展过程已经重要性&#xff0c;还初步了解了C中一些相比C语言特有的知识点&#xff0c;例如命名空间、缺少参数、函数重载、引用等&#xff0c;接下来在本篇中我们将开始C整个体系中非常重要的一个知识章节——类和对象&#xff0c;类和对…

Unity新输入系统 之 InputActions(输入配置文件)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 首先你应该了解新输入系统的基本单位Unity新输入系统 之 InputAction&#xff08;输入配置文件最基本的单位&#xff0…

React 学习——react项目中加入echarts图

实现的代码如下&#xff1a; import * as echarts from echarts import { useEffect, useRef } from react; const Home ()>{const chartRef useRef(null);useEffect(()>{// const chartDom document.getElementById(main);//使用id获取节点const chartDom chartRef…

【区块链+乡村振兴】“蜜链盟”乡村振兴基层治理数字化平台 | FISCO BCOS应用案例

在国家战略政策推动和新一代信息化发展应用的合力之下&#xff0c;数字乡村是互联网化、信息化和数字化在农业农村经 济社会发展中的表现。为进一步加强乡村基层治理&#xff0c;根据《中共海南省委农村工作领导小组办公室海南省农业农 村厅关于在我省乡村治理中推广运用积分制…

用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)

exceljs在Jquery&#xff08;HTML&#xff09;和vue项目中实现导出功能 前言Jquery&#xff08;HTML&#xff09;中实现导出第一步&#xff0c;先在项目本地中导入exceljs和file-saver包第二步&#xff0c;封装导出Excel方法&#xff08;可直接复制粘贴使用&#xff09;第三步&…

Java 实现 B树(通俗易懂)

目录 一.概念 二.节点定义 三.插入操作 1.查找位置 2.插入 3.分裂 四.B树和B*树 1.B树 2.B*树 一.概念 B树是一颗多叉平衡树&#xff0c;空树也是多叉平衡树。 一颗M阶的B树要满足以下条件&#xff1a; 1.根节点至少有两个孩子&#xff1b; 2.每个非根节点至少有(上…

机械学习—零基础学习日志(如何理解线性代数2)

零基础为了学人工智能&#xff0c;正在快乐学习&#xff0c;每天都长脑子 引言 在平面中&#xff0c;直线的定义可以理解为&#xff0c;任意缩放同一个平面向量得到所有点的集合。 所以要得到一个三维空间中的直线&#xff0c;只需要将这个向量改成三维向量即可。 什么是线…

uniapp加载第三方字体方案对比(附原生微信小程序方案)

文章目录 官方文档uniapp文档微信小程序文档 下载字体包引入方案限制微信小程序限制uniapp的限制 方案对比方案1&#xff1a;CSS本地加载方案2&#xff1a;CSS远程加载方案3&#xff1a;转换为base64&#xff0c;然后通过css引入方案4&#xff1a;使用uni.loadFontFace() 页面使…

(Jmeter、Fiddler)脚本转换Loadrunner脚本

背景&#xff1a;公司政治任务、各种体系文档要留档&#xff0c;但有些不在体系内的工具生成的脚本需要转化到体系内以备留档。 一、Loadrunner代理设置 开始录制配置&#xff1a; Record->Remote Application via LoadRunner Proxy LoadRrunner Proxy listens on port-…

米联客-FPGA程序设计Verilog语法入门篇连载-19 Verilog语法_低功耗设计

软件版本&#xff1a;无 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用所有系列FPGA 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑&#xff01; 1概述 本小节讲解Verilog语法的低功…