实现自定义Spring Boot Starter

news2024/11/14 1:17:56

实现自定义Spring Boot Starter

  • 一、原理
  • 二、实战
    • 1 自定义 Spring Boot Starter
      • 1.1 添加maven依赖
      • 1.2 属性类AuthorProperties
      • 1.3 自动配置类AuthorAutoConfiguration
      • 1.4 业务逻辑AuthorServer
      • 1.5 spring.factories
    • 2 测试自定义的 Spring Boot Starter
      • 2.1 新建module或者新建工程
      • 2.2 创建controller
      • 2.3 yml配置文件
      • 2.4 启动项目
      • 2.5 项目整体结构及源码

Spring Boot 可以省略众多的繁琐配置,它的众多 starter 可以说是功不可没。 Spring Boot默认定义了很多的starter(spring-boot-starter-xxx),这些starter的简化了很多烦琐的配置,通过引入各种 Spring Boot Starter 包可以快速搭建出一个项目的脚手架。常用的 starter 还有 spring-boot-starter-web、spring-boot-starter-test、spring-boot-starter-jdbc,相比于传统的 xml 配置可以说是大大减少了集成的工作量。不过也是不可能应付所有需求的,根据我们自己的业务,我们可以自定义 starter 来实现项目中复用度高的业务,让别的模块能很方便的引入使用。

一、原理

利用 starter 实现自动化配置只需要两个条件:maven 依赖和配置文件,这里简单介绍下starter 实现自动化配置的流程。
引入 maven 依赖实质上就是导入 jar 包,Spring Boot 项目启动的时候会找到 starter jar 包中的 resources/META-INF/spring.factories 文件,根据 spring.factories 文件中的配置,加载需要自动配置的类。
以 mybatis-spring-boot-starter 为例,其自动配置类之一如下:

@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties({MybatisProperties.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class})
public class MybatisAutoConfiguration implements InitializingBean {
    ...
}        

对 MybatisAutoConfiguration 中用到的注解的说明,参考如何实现自定义的 Spring Boot Starter
在这里插入图片描述
mybatis-spring-boot-starter 的 pom 文件引用了 mybatis-spring-boot-autoconfigure 依赖,其中的 spring.factories 文件配置如下:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration,\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

这样,便可以在 Spring Boot 项目启动的时候会加载 mybatis starter 中的 MybatisLanguageDriverAutoConfiguration 和 MybatisAutoConfiguration 类。

二、实战

首先实现自定义的 spring-boot-starter;其次,通过一个新的工程 来引入该 starter,测试自定义starter是否生效。

1 自定义 Spring Boot Starter

功能描述:此starter供使用时获取到配置文件的属性值,作为业务逻辑的参数实现相关功能。

1.1 添加maven依赖

这里说下artifactId的命名问题:Spring 官方 Starter 通常命名为 spring-boot-starter-{name},如 spring-boot-starter-web;非官方 Starter 命名应遵循{name}-spring-boot-starter的格式

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

1.2 属性类AuthorProperties

用于获取配置文件前缀为custom的value值

@ConfigurationProperties(prefix = "custom")
public class AuthorProperties {
    public static final String DEFAULT_AUTHOR = "zsh";
    public String author = DEFAULT_AUTHOR;
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
}

1.3 自动配置类AuthorAutoConfiguration

@Configuration
@ConditionalOnClass({ AuthorServer.class })
@EnableConfigurationProperties(AuthorProperties.class)
public class AuthorAutoConfiguration {
    @Resource
    private AuthorProperties authorProperties;
    @Bean
    @ConditionalOnMissingBean(AuthorServer.class)
    @ConditionalOnProperty(name = "custom.author.enabled", matchIfMissing = true)
    public AuthorServer authorResolver() {
        AuthorServer authorServer = new AuthorServer();
        authorServer.setAuthor(authorProperties.getAuthor());
        return authorServer;
    }
}

@ConditionalOnClass 表示有 ExampleService 类存在时执行。
@EnableConfigurationProperties 表示有 ExampleProperties 类存在时执行。
@ConditionalOnMissingBean 当 ExampleService Bean 缺失时,执行下段代码。
@ConditionalOnProperty 当 example.service.enabled = true 时,执行代码。

1.4 业务逻辑AuthorServer

public class AuthorServer {
    public String author;
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
}

1.5 spring.factories

在 resources 目录下新建 META_INF 文件夹,并在其中新建 spring.factories,在其中写入:

# CUSTOM
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.zsh.AuthorAutoConfiguration

至此,Starter 项目创建完成,使用 mvn install 命令打包。
在这里插入图片描述
出现BUILD SUCCESS代表打包成功!
在这里插入图片描述

2 测试自定义的 Spring Boot Starter

2.1 新建module或者新建工程

在pom文件中引入自定义的Spring Boot Starter

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

2.2 创建controller

@RestController
@RequestMapping("/userController")
public class UserController {

	@Autowired
	private UserService userService;


	@Autowired
	private AuthorServer authorServer;

	//获取自定义stater方法
	@RequestMapping("/author")
	String home() {
		return "发布者:"+ authorServer.getAuthor();
	}
}	

2.3 yml配置文件

custom:
  author: hello-world
  enabled: true

2.4 启动项目

http请求结果如下,代表新工程调用自定义starter成功!

localhost:8086/userController/author

在这里插入图片描述

2.5 项目整体结构及源码

源码下载,欢迎star!SpringBoot2.XLearn
在这里插入图片描述
参考资料
springboot自定义和使用starter
【企业级解决方案一】编写一个自己的SpringBootStarter
springboot如何自定义starter
如何实现自定义的 Spring Boot Starter?

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

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

相关文章

什么软件能识别软件?学会这几个软件就可以了

在日常学习或工作中&#xff0c;我们经常会因为各种各样的原因&#xff0c;导致资料无法记全。比如上课的时候老师讲课速度过快、或者开会时需要整理的资料太多&#xff0c;我们做不到一心二用&#xff0c;边听边记。你们遇到类似情况的时候&#xff0c;都是怎么解决的呢&#…

0x02. Spring Boot 3 之SpringBoot 版本升级最佳实践指南

Spring Boot 3 之SpringBoot低版本升级最佳实践0x01 前言0x02 升级Spring Boot2.1 从Spring Boot 1.5.x 升级到Spring Boot 2.x2.1.1 依赖检查2.1.2 检查自定义配置2.1.3 检查系统需要2.1.4 升级到Spring Boot 2.x2.1.5 配置属性迁移2.2 从Spring Boot 2.7.x 升级到Spring Boot…

概率统计·样本及抽样分布【随机样本、抽样分布】

总体与个体 总体&#xff1a;试验的全部可能的观察值称为总体 个体&#xff1a;总体中每个可能的观察值称为个体 总体期望样本平均期望 总体方差/n样本平均方差 随机样本 X1&#xff0c;X2……Xn相互独立&#xff08;x1&#xff0c;x2……xn是观察值&#xff09;&#xff0…

[附源码]计算机毕业设计springboot疫苗及注射管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

STC 51单片机52——自发自收串行通信

#include <reg52.h> unsigned char ch0; /* 初始化函数 */ void uart_init() { TMOD0x20; //T1为方式2 TL10xfd; TH10xfd; //波特率为9600的计数初值 SCON0x50; //串口工作在方式1。允许接收 …

[附源码]Python计算机毕业设计Django基于Java的日用品在线电商平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

五问补盲(一) | 激光雷达补盲,视场多大算大?

作者 | 爱LiDAR的小飞哥 编辑 | 王博“大&#xff01;超大&#xff01;更大&#xff01;” 最近&#xff0c;补盲激光雷达市场热闹非凡&#xff0c;各家在宣传产品的视场角时竭尽全力&#xff0c;毫不吝啬形容词。 回归到实际需求&#xff0c;多大的视场角够用&#xff1f;超大…

西门子触摸屏上电显示初始画面几秒后,自动切换到下一个画面的具体方法

西门子触摸屏上电显示初始画面几秒后,自动切换到下一个画面的具体方法 例如:在启动画面停留10秒后,切换到其他画面。 具体实现方法可参考以下内容: 如下图所示,新建一个项目,在画面中添加2个画面, 如下图所示,在变量中添加一个内部变量tag1,用于控制画面的切换, …

es查询响应结果中获取某些字段的值

有时候使用es查询出的结果包含多个字段&#xff0c;如果数据中仅仅包含几个字段时&#xff0c;我们是很容易挑出自己需要的字段值&#xff0c;但是如果数据中包含几十或者几百甚至更多时&#xff0c;尤其是数据中嵌套好多层时&#xff0c;不容易直接挑取出需要的值&#xff0c;…

【人工智能/算法】搜索求解(Solving Problems by Searching)

文章目录一、求解与搜索二、盲目式搜索1. 深度优先搜索&#xff08;Depth First Search, DFS&#xff09;回溯搜索&#xff08;Backtracking Search&#xff09;2. 广度优先搜索&#xff08;Breadth First Search, BFS&#xff09;一致代价搜索&#xff08;Uniform-cost Search…

你们看过《点燃我,温暖你》没有呀,里面比较火的那个爱心代码,今天小编用Python实现啦,这就是程序员的烂漫吗

前言 包子们&#xff0c;上午好 最近有个剧挺火的 就是那个程序员的剧&#xff0c;叫《点燃我&#xff0c;温暖你》 最近听说很火呀&#xff0c;那作为程序员&#xff0c;Python中的战斗机的小编&#xff0c;能不给大家安排一波&#xff01; 怎么说呢&#xff0c;用这个表白也…

DJ13-1 汇编语言程序设计-1

目录 一、基本概念 1. 机器语言&#xff08;machine language&#xff09; 2. 汇编语言&#xff08;assembly language&#xff09; 3. 汇编语言源程序 4. 汇编&#xff08;assemble&#xff09; 5. 汇编程序&#xff08;assembler&#xff09; 6. 宏汇编程序&#xff0…

[附源码]JAVA毕业设计教材管理(系统+LW)

[附源码]JAVA毕业设计教材管理&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xf…

利用CMOS数字隔离器提高智能计量解决方案的数据完整性和可靠性

介绍 随着消费者从传统的机电电表升级到联网的智能电表&#xff0c;自动读表&#xff08;AMR&#xff09;市场预计在未来几年将以两位数的速度增长。当今先进的智能电表使用最新的集成电路&#xff08;IC&#xff09;技术来准确地测量和报告所消耗的耗电量。虽然智能电表比机电…

【pen200-lab】10.11.1.231

pen200-lab 学习笔记 【pen200-lab】10.11.1.231 &#x1f525;系列专栏&#xff1a;pen200-lab &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月27日&#x1f334; &#x1f36d;作…

Metabase学习教程:系统管理-2

数据共享指南 在组织内部或外部&#xff0c;共享数据或分析的选项是什么&#xff1f;何时应该使用一种方法而不是另一种方法&#xff1f; 你有数据&#xff0c;你想&#xff08;或被要求&#xff09;分享它。这些数据是一个问题还是一个访问多个数据库完整的问题数据资料室&a…

SpringCloud - Sentinel熔断与限流

文章目录一.Sentinel下载安装运行二.Sentinel初始化监控三.流控规则1. 阈值类型1.1 QPS1.2 线程数2. 流控模式2.1 直接2.2 关联2.3 链路3. 流控效果3.1 快速失败3.2 WarmUp预热3.3 排队等待四.降级规则1. RT2. 异常比例3. 异常数五.Sentinel 热点key1. 基本使用2. 参数例外项六…

Spring Data JPA - Web 支持、排序和分页

在前面的教程中&#xff0c;我们已经看到了如何使用 Spring Data 分页 Web 支持。在本教程中&#xff0c;我们将了解如何使用排序支持。 在基于 Web 的应用程序中应用排序主要有两种方法&#xff1a; 按可分页处理程序参数排序 我们在前面的示例中使用过&#xff0c;但没有任…

【经验】Word 2021|如何在Word里做出和Markdown中一样漂亮的引用样式(结尾附成品)

文章目录写在最前方法以及参数1 打开样式窗口2 设置一些基本操作3 打开格式窗口4 修改样式最后一步&#xff01;保持间隔成品的介绍&#xff08;一些自卖自夸&#xff09;获取链接&#xff08;不想看做法的话直接下载&#xff09;写在最前 Word 版本&#xff1a;2021 这个文章是…

[附源码]JAVA毕业设计技术的游戏交易平台(系统+LW)

[附源码]JAVA毕业设计技术的游戏交易平台&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…