Spring Boot自定义Starter

news2025/1/6 21:08:45

下面是一个详细的 Spring Boot 自定义 Starter 教程,分步骤讲解相关内容,包括 spring.factoriesAutoConfiguration.importsEnvironmentPostProcessor 等核心知识点,帮助深入理解自定义 Starter 的实现过程。


1. 什么是 Spring Boot Starter

Spring Boot Starter 是一个模块化的库,它通过自动配置的方式,简化了功能的集成。例如:spring-boot-starter-webspring-boot-starter-data-jpa 等。我们可以通过自定义 Starter 提供特定功能(如统一日志、动态环境配置等)。


2. 自定义 Starter 的核心概念

2.1 自动配置

自动配置是 Starter 的核心功能。Spring Boot 使用 @EnableAutoConfiguration 和特定配置文件(如 spring.factoriesAutoConfiguration.imports)实现自动加载模块的配置。

2.2 环境初始化(可选)

如果需要在 Spring 应用加载前修改配置,可以使用 EnvironmentPostProcessor


3. 自定义 Starter 的实现步骤

我们以开发一个自定义 Starter 为例:实现一个统一的日志打印功能,并动态支持环境变量的加载。

3.1 创建一个 Maven 模块

  1. 使用 Maven 创建一个新模块:

    mvn archetype:generate -DgroupId=com.example -DartifactId=custom-spring-boot-starter -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    
  2. pom.xml 中引入必要的依赖:

    <dependencies>
        <!-- Spring Boot Starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot</artifactId>
        </dependency>
    </dependencies>
    

3.2 创建自动配置类

创建自动配置类,用于注册自定义的日志服务。

package com.example.starter;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@AutoConfiguration // 使用 @AutoConfiguration 替代传统的 @Configuration
public class LogAutoConfiguration {

    // 只有当 custom.log.enabled=true 时,注册 MyLogService Bean
    @Bean
    @ConditionalOnProperty(name = "custom.log.enabled", havingValue = "true", matchIfMissing = true)
    public MyLogService myLogService() {
        return new MyLogService();
    }
}

3.3 创建日志服务类

这是实际的业务逻辑,打印日志。

package com.example.starter;

public class MyLogService {

    public void log(String message) {
        System.out.println("Custom Log: " + message);
    }
}

3.4 配置 spring.factoriesAutoConfiguration.imports

方式1:使用 spring.factories

resources/META-INF/spring.factories 中添加以下内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.starter.LogAutoConfiguration
方式2:使用 AutoConfiguration.imports

resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中添加以下内容:

com.example.starter.LogAutoConfiguration

建议使用 AutoConfiguration.imports,它是 Spring Boot 2.7+ 的推荐方式,性能更优,维护更方便。


3.5 动态环境配置(可选)

如果需要在 Spring Boot 应用启动时动态修改配置,可以实现 EnvironmentPostProcessor

创建 EnvironmentPostProcessor 实现类
package com.example.starter;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;

import java.util.HashMap;
import java.util.Map;

public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor {

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        // 动态添加环境变量
        Map<String, Object> customProperties = new HashMap<>();
        customProperties.put("custom.log.enabled", "true"); // 默认启用日志

        environment.getPropertySources().addLast(new MapPropertySource("customProperties", customProperties));
    }
}
spring.factories 中注册
org.springframework.boot.env.EnvironmentPostProcessor=\
com.example.starter.CustomEnvironmentPostProcessor

3.6 打包 Starter

使用 Maven 打包:

mvn clean install

4. 在其他项目中使用 Starter

  1. 在主项目中引入 Starter:

    <dependency>
        <groupId>com.example</groupId>
        <artifactId>custom-spring-boot-starter</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    
  2. application.properties 中启用自定义日志:

    custom.log.enabled=true
    
  3. 在主项目中测试:

    package com.example.demo;
    
    import com.example.starter.MyLogService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class DemoApplication implements CommandLineRunner {
    
        @Autowired
        private MyLogService myLogService;
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @Override
        public void run(String... args) throws Exception {
            myLogService.log("Hello, Spring Boot Starter!");
        }
    }
    

5. 核心知识点补充

5.1 spring.factoriesAutoConfiguration.imports 的区别

特性spring.factoriesAutoConfiguration.imports
使用版本Spring Boot 1.x 和 2.xSpring Boot 2.7+
文件路径META-INF/spring.factoriesMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
加载机制较旧的 EnableAutoConfiguration 实现更高效的自动配置加载
推荐性不推荐(可能被弃用)推荐

5.2 EnvironmentPostProcessor 使用场景

  • 动态修改环境变量;
  • 添加外部配置源(如远程配置中心);
  • 基于启动参数动态配置。

6. 总结

通过本教程,我们实现了一个自定义 Spring Boot Starter,包括以下内容:

  • 自动配置类;
  • 使用 spring.factoriesAutoConfiguration.imports 注册;
  • 动态加载配置(EnvironmentPostProcessor);
  • 打包发布并测试。

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

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

相关文章

蓝桥杯-Python

1. 冒泡排序 算法步骤&#xff1a; 比较相邻元素&#xff0c;如果第一个大于第二个则交换从左往右遍历一遍&#xff0c;重复第一步&#xff0c;可以保证最大的元素在最后面重复上述操作&#xff0c;可以得到第二大、第三大、… n int(input()) a list(map(int, input()…

数据库实时会话管理,性能问题诊断后的临门一脚

目录 前言 实时会话管理 DBdoctor 实时会话功能 1.实时会话列表 2.结束会话 3.操作历史 4.SQL分析 结语 前言 在之前的文章中我们介绍了DBdoctor性能洞察功能&#xff0c;它能够快速量化数据库连接会话单条SQL的资源消耗&#xff0c;实现性能问题快速根因定位并给出优…

GBase 8s 数据库备份还原

每一天都是一个新的篇章&#xff0c;等待着你去书写属于自己的故事&#xff01;&#xff01;&#xff01; 一&#xff1a;备份 1.1.下载脚本文件&#xff0c;并上传到数据库服务器上相应目录。 解压后目录为&#xff1a; 说明&#xff1a; dbcomm.sh&#xff1a;导出注释脚本…

PHP框架+gatewayworker实现在线1对1聊天--发送消息(6)

文章目录 发送消息原理说明发送功能实现html部分javascript代码PHP代码 发送消息原理说明 接下来我们发送聊天的文本信息。点击发送按钮的时候&#xff0c;会自动将文本框里的内容发送出去。过程是我们将信息发送到服务器&#xff0c;服务器再转发给对方。文本框的id为msgcont…

DuckDB:密钥管理器及其应用

密钥管理器(Secrets Manager)为所有使用密钥的后端提供了统一的用户界面。密钥信息可以被限定范围&#xff0c;因此不同的存储前缀可以有不同的密钥信息&#xff0c;例如允许在单个查询中连接跨组织的数据。密钥也可以持久化&#xff0c;这样就不需要在每次启动DuckDB时都指定它…

告别Kibana:Elasticsearch 桌面客户端的新变革

告别Kibana&#xff1a;Elasticsearch 桌面客户端的新变革 在大数据处理与分析领域&#xff0c;Elasticsearch 及其相关技术的应用日益广泛。长期以来&#xff0c;Kibana 在数据可视化与查询管理方面占据重要地位&#xff0c;但随着技术的不断发展&#xff0c;用户对于更高效、…

模块化通讯管理机在物联网系统中的应用

安科瑞刘鸿鹏 摘要 随着能源结构转型和智能化电网的推进&#xff0c;电力物联网逐渐成为智能电网的重要组成部分。本文以安科瑞ANet系列智能通信管理机为例&#xff0c;探讨其在电力物联网中的应用&#xff0c;包括数据采集、规约转换、边缘计算、远程控制等技术实践&#…

AAAI 2025论文分享┆一种接近全监督的无训练文档信息抽取方法:SAIL(文中附代码链接)

本推文详细介绍了一篇上海交通大学乐心怡老师课题组被人工智能顶级会议AAAI 2025录用的的最新论文《SAIL: Sample-Centric In-Context Learning for Document Information Extraction》。论文的第一作者为张金钰。该论文提出了一种无需训练的、以样本为中心的、基于上下文学习的…

SAP物料主数据界面增加客制化字段、客制化页签的方式

文章目录 前言一、不增加页签&#xff0c;只增加客制化字段二、增加物料主数据页签 前言 【SAP系统MM模块研究】 #SAP #MM #物料 #客制化 #物料主数据 项目上难免会遇到客户要在物料主数据的界面上&#xff0c;增加新字段的需求。 实现方式有&#xff1a; &#xff08;1&…

ROS2软件架构全面解析-学习如何设计通信中间件框架

前言 ROS&#xff08;Robot Operating System&#xff09; 2 是一个用于开发机器人应用的软件平台&#xff0c;也称为机器人软件开发工具包 (SDK)。 ROS2是ROS1的迭代升级版本 &#xff0c;最主要的升级点是引入DDS&#xff08;Data Distribution Service&#xff09;为基础的…

接口自动化测试流程、工具及其实践

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、接口自动化测试简介 接口自动化测试是指通过编写脚本或使用自动化工具&#xff0c;对软件系统的接口进行测试的过程。接口测试是软件测试中的一种重要测试类…

香橙派5plus单独编译并安装linux内核无法启动的原因分析与解决记录

1 说明 我依照官方手册编译单独编译linux内核&#xff0c;安装后重启出现内核启动失败的问题,编译和安装步骤如下&#xff1a;# 1. 克隆源码 git clone --depth1 -b orange-pi-6.1-rk35xx https://github.com/orangepi-xunlong/linux-orangepi# 2 配置源码 make rockchip_linu…

数据库知识汇总1

一. 数据库系统概述 信息需要媒体&#xff08;文本、图像视频等&#xff09;表现出来才能被人类所获取&#xff0c;媒体可以转换成比特或者符号&#xff0c;这些称为数据&#xff1b; 数据/信息的特点&#xff1a;爆炸式增长、无限复制、派生&#xff1b; 数据库是指长期长期…

Win32汇编学习笔记03.RadAsm和补丁

Win32汇编学习笔记03.RadAsm和补丁-C/C基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 扫雷游戏啊下补丁 在扫雷游戏中,点关闭弹出一个确认框,确认之后再关闭,取消就不关闭 首先第一步就是确认关闭按钮响应的位置,一般都是 WM_CLOSE 的消息 ,消息响应一般都在过…

OSPF特殊区域(open shortest path first LSA Type7)

一、区域介绍 1、Stub区域 Stub区域是一种可选的配置属性。通常来说&#xff0c;Stub区域位于自治系统的边界&#xff0c;例如&#xff0c;只有一 个ABR的非骨干区域。在这些区域中&#xff0c;设备的路由表规模以及路由信息传递的数量都会大量减少。 kill 4 5类type 传递1 …

论文解读之Generative Dense Retrieval: Memory Can Be a Burden

本次论文解读&#xff0c;博主带来生成式稠密检索&#xff1a;记忆可能成为一种负担的论文分享 一、简介 生成式检索根据给定的查询&#xff0c;自回归地检索相关的文档标识符&#xff0c;在小规模的文档库中表现不错&#xff0c;通过使用模型参数记忆文档库&#xff0c;生成…

vue,使用unplugin-auto-import避免反复import,按需自动引入

项目库&#xff1a;https://github.com/unplugin/unplugin-auto-import 参考&#xff1a; https://juejin.cn/post/7012446423367024676 https://cloud.tencent.com/developer/article/2236166 背景&#xff1a; vue3项目中&#xff0c;基本所有页面都会引入vue3框架的api&…

[深度学习] 大模型学习1-大语言模型基础知识

大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是一类基于Transformer架构的深度学习模型&#xff0c;主要用于处理与自然语言相关的各种任务。简单来说&#xff0c;当用户输入文本时&#xff0c;模型会生成相应的回复或结果。它能够完成许多任务&…

OCR图片中文字识别(Tess4j)

文章目录 Tess4J下载 tessdataJava 使用Tess4j 的 demo Tess4J Tess4J 是 Tesseract OCR 引擎的 Java 封装库&#xff0c;它让 Java 项目更轻松地实现 OCR&#xff08;光学字符识别&#xff09;功能。 下载 tessdata 下载地址&#xff1a;https://github.com/tesseract-ocr/…

Vue2/Vue3使用DataV

Vue2 注意vue2与3安装DataV命令命令是不同的Vue3 DataV - Vue3 官网地址 注意vue2与3安装DataV命令命令是不同的 vue3vite 与 Vue3webpack 对应安装也不同vue3vite npm install kjgl77/datav-vue3全局引入 // main.ts中全局引入 import { createApp } from vue import Da…