自定义Spring Boot Starter

引言

在Spring Boot的世界中,Starter 能够简化我们的开发过程,通过封装常见的依赖和自动配置。本篇旨在为有志于进一步简化Spring Boot应用配置的开发者提供指导,让我们一起创建一个自定义的Spring Boot Starter。

一、什么是 Spring Boot Starter?

Starter是Spring Boot中的一个核心概念,它是一种依赖描述符,用于简化Maven或Gradle项目中的依赖管理和自动配置。Starter通常包含一组预定义的依赖项和一个或多个自动配置类,它们可以帮助开发人员快速启动和运行一个特定类型的应用程序。

Starter的工作原理如下:
  • 依赖管理:Starter通过将常用库和框架组织在一起,简化了项目的依赖声明。例如,如果一个项目需要使用Spring MVCJackson JSON库,只需添加spring-boot-starter-web依赖即可,无需手动添加Spring MVC和其他相关依赖。
  • 自动配置:Starter中的自动配置类会根据项目的依赖关系和属性设置自动应用最佳实践配置。这些自动配置类通常位于org.springframework.boot.autoconfigure包中。例如,当添加spring-boot-starter-web依赖时,Spring
    Boot会自动配置嵌入式Tomcat服务器和Spring MVC相关的组件。
  • 约定优于配置:Starter遵循Spring Boot的核心原则之一,即“约定优于配置”。这意味着,除非明确指定,否则默认配置将应用于项目。这有助于减少不必要的配置,并使项目更易于维护。
Spring Boot如何使用Starter来简化项目配置:
  • 选择适当的Starter:根据项目需求,从Spring Boot提供的众多Starter中选择合适的依赖。例如,对于Web应用程序,可以添加spring-boot-starter-web;对于数据访问,可以添加spring-boot-starter-data-jpa等。
  • 添加依赖:在项目的构建配置文件(如pom.xml或build.gradle)中添加所选Starter的依赖。
  • 自定义配置(可选):虽然Starter提供了许多默认配置,但开发人员仍然可以根据需要自定义这些配置。这可以通过在项目的配置文件(如application.propertiesapplication.yml)中覆盖默认值来实现。
  • 编写业务代码:在Starter的帮助下,开发人员可以将更多精力投入到业务代码的编写上,而不是关注底层的配置细节。

二、自定义 Starter 的动机

  • 特定领域的需求:当你的项目或产品需要针对特定领域进行优化,而现有的Starter无法满足这些需求时,创建自定义Starter就变得很有必要。例如你的公司可能有一套特定的日志记录策略,或者需要集成一个特殊的安全框架,而这些都不是通用的Starter所能提供的。
  • 封装复杂性:如果项目中有一些复杂的配置或组件集成,而这些配置经常需要在多个项目中重复使用,那么通过创建一个自定义Starter来封装这些复杂性,可以避免在每个项目中重复相同的配置代码,提高开发效率。
  • 促进代码复用:在大型组织或企业中,可能有多个团队在不同的项目中工作。如果这些项目有共同的技术栈或依赖需求,创建一个自定义Starter可以帮助各个团队共享复用代码,减少重复劳动。
  • 遵循最佳实践:有时候,组织内部可能已经形成了一套开发最佳实践,通过创建一个自定义Starter,可以将这些最佳实践固化并自动应用到所有新项目中,确保开发质量和一致性。
  • 提供更好的开发者体验:自定义Starter可以为开发者提供更加友好的开发体验,例如通过简化配置流程提供清晰的文档示例代码,使得新加入项目的开发者能够更快地上手.

三、创建自定义 Starter

新建一个普通Maven项目:yu-spring-boot-starter

① 编写启动器

在这里插入图片描述

② 导入依赖
 <!-- 引入Spring Boot自动配置依赖 ,用于自动配置应用程序的各种组件和功能.自定义starter时必须要有 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId>
</dependency><!-- 引入Spring Boot配置处理器,自定义starter时,调用方的配置文件中可以给出提示信息(如不引用,则不会提示,此包非必须) -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><!-- 表示两个项目之间依赖不传递:不设置optional或者optional是false,表示传递依赖;当出现依赖冲突时候,会自动剔除该依赖- --><optional>true</optional>
</dependency>
③ 添加属性类

如果你的Starter需要一些配置属性,你可以创建一个属性类来绑定这些属性。创建一个新的Java类,并使用@ConfigurationProperties注解标记它为属性类。在该类中,定义你需要的属性,并提供相应的gettersetter方法。

/*** 将配置文件中以 "yu" 为前缀的属性值绑定到此Java类上* starter被引用时,会将驼峰命名的参数名称转化为全小写,并在原大写的前面添加"-",* 如本类的userName属性,yu.user-name来进行展现*/
@ConfigurationProperties(prefix = "yu")
public class User {private String userName;private String userPassword;//省略get/set...
}
④ 添加一个业务类

定义一个业务类,编写核心业务流程

public class UserServiceImpl {@Autowiredprivate User user;public String getUserInfo() {return user.getUserName() + "_" + user.getUserPassword();}
}
⑤ 自定义属性配置

需要创建一个自动配置类,用于配置和初始化我们的Starter。创建一个新的Java类,并使用@Configuration注解标记它为配置类。

@Configuration	// 表示这个类为配置类
@EnableConfigurationProperties(User.class)	// 启用 User 类的配置属性
public class YuStarterAutoConfiguration {// 在这里定义你要注册的对象@Bean@ConditionalOnClass(UserServiceImpl.class)		// 只有当指定的类存在于类路径中时,才会创建该方法返回的 Beanpublic UserServiceImpl serviceStarterTest() {return new UserServiceImpl();}
}
⑥ 添加需要自动配置的配置类信息

在resources编写一个自己的 META-INF\spring.factories

# 自动配置,如果有多个配置则使用",\"结尾的方式即可
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.yu.config.YuStarterAutoConfiguration
⑦ 编译打包

maven–>clear–>install即可
在这里插入图片描述

⑧ 引用

新建一个SpringBoot 项目,导入我们自己写的启动器

<dependency><groupId>com.yu</groupId><artifactId>yu-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version>
</dependency>

编写一个 HelloController 进行测试我们自己的写的接口!

@RestController
@RequestMapping("test")
public class UserTestController {@Autowiredprivate UserServiceImpl userService;@RequestMapping("starter")@ResponseBodypublic String starter() {return userService.getUserInfo();}
}

编写配置文件 application.properties

yu.user-name=https://blog.csdn.net/m0
yu.user-password=53127626

启动项目进行测试,结果成功 !

https://blog.csdn.net/m0_53127626

在这里插入图片描述

四、总结

本文详细介绍如何自定义一个Spring Boot Starter。通过自定义Starter,我们可以将一些通用的功能封装起来,提高代码的复用性和可维护性。


希望本文对您有所帮助!

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

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

相关文章

浅谈基于中台模式的大数据生态体系的理解

这篇文章主要浅谈一下我对大数据生态体系建设的理解。 大数据生态系统为高并发&#xff0c;高吞吐&#xff0c;高峰值&#xff0c;高堆积等大规模数据的采集&#xff0c;处理&#xff0c;计算&#xff0c;存储&#xff0c;服务提供了完善的处理体系&#xff0c;致力于打造核心数…

springboot190基于springboot框架的工作流程管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

机器学习12-基本感知器

感知器(Perceptron)是一种最简单的人工神经网络结构,由美国心理学家Frank Rosenblatt在1957年提出。它是一种单层的前馈神经网络,通常用于二分类问题。 基本感知器由多个输入节点、一个输出节点和一组权重参数组成。每个输入节点都与输出节点连接,并且具有一个对应的权重参…

力扣36.有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 注…

VSCode无法连接远程服务器的两种解决方法

文章目录 VSCode Terminal 报错解决方式1解决方式2you are connected to an OS version that is unsupported by Visual Studio Code解决方法 VSCode Terminal 报错 直接在terminal或cmd中使用ssh命令可以连接服务器&#xff0c;但是在vscode中存在报错&#xff0c;最后一行为…

kali无线渗透之WEP加密模式与破解13

WEP加密是最早在无线加密中使用的技术&#xff0c;新的升级程序在设置上和以前的有点不同&#xff0c;功能当然也比之前丰富一些。但是随着时间的推移&#xff0c;人们发现了WEP标准的许多漏洞。随着计算能力的提高&#xff0c;利用难度也越来越低。尽管WEP加密方式存在许多漏洞…

【C++】const、static关键字和构造函数初始化

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 1. const修饰成员函数 1.1 语法格式 1.2 权限放大缩小 1.3 思考 1.4 解答 2. 再谈构造函数 2.1 构造函数体赋值 2.2 初始…

书生浦语大模型实战营-课程笔记(1)

模型应用过程&#xff0c;大致还是了解的。和之前实习做CV项目的时候比起来&#xff0c;多了智能体这个环节。智能体是个啥&#xff1f; 类似上张图&#xff0c;智能体不太清楚。感觉是偏应用而不是模型的东西&#xff1f; 数据集类型很多&#xff0c;有文本/图片/视频。所以…

代码随想录算法训练营Day32 | 122.买卖股票的最佳时机 II、55.跳跃游戏、45.跳跃游戏 II

122.买卖股票的最佳时机 II 这题感觉还是偏简单的&#xff0c;主要是要理解一点&#xff1a;本题中股票能当天买入当天卖出且能得知明天的股票价格 这个设定省去了很多麻烦&#xff0c;每天先无脑买入即可&#xff0c;如果第二天价格更高就第二天卖出&#xff0c;如果第二天价…

IDEA玩转Git

GIT 基本概念 本地版本控制 git add git commit git checkout Git - Reference 向日葵下载地址:向日葵远程控制app官方下载 - 贝锐向日葵官网 远程库

【Java】笔记:JDBC中Statement常用的几个执行函数

1.executeQuery(String sql): ResultSet 用于执行查询语句&#xff08;SELECT&#xff09;&#xff0c;返回一个 ResultSet 对象&#xff0c;该对象包含了查询结果的数据。可以通过 ResultSet 提供的方法来获取查询结果。 //声明statement Statement statement connection.c…

神要封,仙要修

&#xff08;1&#xff09;人间之战 我记得&#xff0c;那一年&#xff0c;西方的胡夫正要开始修建他的死后极乐世界&#xff1a;金字塔。 那一年&#xff0c;东方也爆发了一场人间大战。 很久很久以前&#xff0c;一支来自乌拉尔山脉南麓脚下的游牧部落&#xff0c;骑着马赶着…

ATCoder Beginner Contest 340 A~G

A.Arithmetic Progression&#xff08;模拟&#xff09; 题意&#xff1a; 输出首项为 a a a&#xff0c;末项为 b b b&#xff0c;公差为 d d d的等差数列。 分析&#xff1a; 按照要求模拟。 代码&#xff1a; #include <bits/stdc.h>using namespace std;int ma…

书城项目历程记录2|最后阶段记录

2024年1月31日 p270-276 1.免用户名登录和注销&#xff08;知识点cookie和session&#xff09; 在学习了cookie和session之后&#xff0c;实现了免用户名登录和注销操作。 免用户名就是在本次session登录成功之后&#xff0c;对session进行setAttribute操作&#xff0c;jsp文…

【C++】模板(超详细!!!!!!)

文章目录 前言1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则2.6 声明和定义分离 3. 类模板3.1 类模板的定义格式3.2 类模板的实例化 4. 模板分离编译4.1 什么是分离编译4.2 模板的分离编译 总结 前言 …

记录一下最近遇到的几个二叉树的题型(附好用的遍历模板)

107. 二叉树的层序遍历 II 102. 二叉树的层序遍历 987. 二叉树的垂序遍历 以上三题可共用一个模板&#xff08;dfs记录数的col和row)&#xff0c;不同之处就是使用哈希表的时候调整一下key和value&#xff1a; # Definition for a binary tree node. # class TreeNode: # …

【Linux笔记】进程间通信之管道

一、匿名管道 我们在之前学习进程的时候就知道了一个概念&#xff0c;就是进程间是互相独立的&#xff0c;所以就算是两个进程是父子关系&#xff0c;其中一个进程退出了也不会影响另一个进程。 也因为进程间是互相独立的&#xff0c;所以两个进程间就不能直接的传递信息或者…

网络安全威胁,如何解决缓冲区溢出攻击

目录 一、什么是网络安全 二、什么是缓冲区 三、缓冲区溢出 四、缓冲区溢出攻击的类型 一、什么是网络安全 网络安全&#xff08;Network Security&#xff09;指的是保护计算机网络及其相关设备、系统和数据免受未经授权访问、破坏、篡改、窃取或滥用的威胁和攻击。随着网…

【doghead】VS2022 win11 安装配置WSL2 以编译linux端的cmake项目并运行1

Visual Studio 2022 在Windows上编译调试WSL2 CMake Linux工程 好像是我自己的vs2022的一个插件支持rust https://github.com/kitamstudios/rust-analyzer.vs/blob/master/PREREQUISITES.md Latest rustup (Rust Toolchain Installer). Install from here. Welcome to Rust!Th…

ElasticSearch分词器和相关性详解

目录 ES分词器详解 基本概念 分词发生时期 分词器的组成 切词器&#xff1a;Tokenizer 词项过滤器&#xff1a;Token Filter 停用词 同义词 字符过滤器&#xff1a;Character Filter HTML 标签过滤器&#xff1a;HTML Strip Character Filter 字符映射过滤器&#x…