自定义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.hqwc.cn/news/469162.html

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

相关文章

第三百二十四回

文章目录 1. 概念介绍2. 原理与方法2.1 知识对比2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"加密包crypto"相关的内容&#xff0c;本章回中将介绍characters包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 在项目中会遇到获取字…

vue3 Element Plus 基于webstorm练习

提要 vue是前端框架&#xff0c;Elemen是组件库。前端框架和组件库的区别与联系 nodejs 脚本语言需要一个解析器才能运行&#xff0c;JavaScript是脚本语言&#xff0c;在不同的位置有不一样的解析器&#xff0c;如写入html的js语言&#xff0c;浏览器是它的解析器角色。而对…

2.14 指针练习

1、选择题 1.1、若有下面的变量定义&#xff0c;以下语句中合法的是&#xff08; A &#xff09;。 int i&#xff0c;a[10]&#xff0c;*p&#xff1b; A&#xff09; pa2; B&#xff09; pa[5]; C&#xff09; pa[2]2; D&#xff09; p&(i2); 解析&am…

【sql】sqlite3数据库

一、介绍 SQLite是一个轻量级的、开源的嵌入式数据库&#xff0c;由D. Richard Hipp使用C语言编写。由于其资源占用少、性能良好和零管理成本的特点&#xff0c;SQLite在嵌入式系统中得到了广泛应用&#xff0c;如Android和iPhone等操作系统中都有内置的SQLite数据库供开发人员…

VueCLI核心知识综合案例TodoList

目录 1 拿到一个功能模块首先需要拆分组件&#xff1a; 2 使用组件实现静态页面的效果 3 分析数据保存在哪个组件 4 实现添加数据 5 实现复选框勾选 6 实现数据的删除 7 实现底部组件中数据的统计 8 实现勾选全部的小复选框来实现大复选框的勾选 9 实现勾选大复选框来…

耳机壳UV树脂制作私模定制耳塞需要注意什么问题?

制作私模定制耳塞需要注意以下问题&#xff1a; 耳模制作&#xff1a;获取准确的耳模是制作私模定制耳塞的关键步骤。需要使用合适的材料和方法&#xff0c;确保耳模的准确性和稳定性。材料选择&#xff1a;选择合适的UV树脂和其它相关材料&#xff0c;确保它们的质量和性能符…

Sentinel 流控-链路模式

链路模式 A B C 三个服务 A 调用 C B 调用 C C 设置流控 ->链路模式 -> 入口资源是 A A、B 服务 package com.learning.springcloud.order.controller;import com.learning.springcloud.order.service.BaseService; import org.springframework.beans.factory.annotatio…

TiDB 在医疗保障信息平台的应用实践

文章介绍了 TiDB 在医疗保障信息平台中的应用。东软医保云应用管理平台通过与 TiDB 联合&#xff0c;成功满足了医疗保障业务中高并发、实时性和复杂查询的要求。在某地市医疗保障信息平台的实践中&#xff0c;TiDB 分布式数据库有效实现了在线交易和实时分析服务&#xff0c;日…

Linux查看日志的几种方法总结

文章目录 摘要1、tailtail命令参数&#xff1a;tail命令的具体例子&#xff1a; catcat 命令的基本用法cat 命令的参数 与其他命令组合使用示例 1&#xff1a;搜索特定文本示例 2&#xff1a;显示匹配行的行号示例 3&#xff1a;忽略大小写搜索示例 4&#xff1a;显示不匹配的行…

vue3+ts+vite+uniapp项目常见问题

vue3tsvite中""路径失效的问题 ""需要进行配置&#xff1a; 首先npm install types/node --save-dev&#xff08;需要用到node其中的path&#xff09;接着在vite.config.ts配置文件中进行配置&#xff1a; 引入 import path from ‘path’&#xff0c;然…

Spring 事务原理总结五

很抱歉&#xff0c;Spring事务本来应该在上一篇就结束的&#xff0c;但因为梳理过程中发现了更多的未知知识&#xff0c;所以便再啰嗦几篇。本篇主要针对前一篇文章——《Spring 事务原理总结四》——末尾提到的几个问题进行梳理&#xff0c;这里再回顾一下这几个问题&#xff…

JavaWeb学习|i18n

学习材料声明 所有知识点都来自互联网&#xff0c;进行总结和梳理&#xff0c;侵权必删。 引用来源&#xff1a;尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版 i18n 国际化&#xff08;Internationalization&#xff09;指的是同一个网站可以支持多种不同的语言&…