Spring Boot自定义Starter

下面是一个详细的 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 {@Overridepublic 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 {@Autowiredprivate MyLogService myLogService;public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@Overridepublic 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.rhkb.cn/news/501533.html

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

相关文章

pygame飞机大战

飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类 启动游戏。 from MainWindow import MainWindow if __name__ __main__:appMainWindow()app.run()2.配置类 该类主要存放游戏的各种设置参数。 #窗口尺寸 import random import pygame WIND…

Flutter中的网络请求图片存储为缓存,与定制删除本地缓存

Flutter中的网络请求图片存储为缓存&#xff0c;与定制删除本地缓存 1&#xff1a;封装请求图片函数 2&#xff1a;访问的图片都会转为本地缓存&#xff0c;当相同的请求url&#xff0c;会在本地调用图片 3&#xff1a;本地缓存管理【windows与andriod已经测试】【有页面】【有…

无线AP安装注意事项

现在的办公楼、酒店等项目中都设计含有网络无线覆盖这一项&#xff0c;在项目实施中&#xff0c;往往采用的是便捷并且后期便于网络无线设备管理的无线ap设备&#xff0c;作为前端无线信号的覆盖。在具体安装无线AP过程中&#xff0c;我们必须要注意以下几点才能保证项目实施完…

Golang的容器编排实践

Golang的容器编排实践 一、Golang中的容器编排概述 作为一种高效的编程语言&#xff0c;其在容器编排领域也有着广泛的运用。容器编排是指利用自动化工具对容器化的应用进行部署、管理和扩展的过程&#xff0c;典型的容器编排工具包括Docker Swarm、Kubernetes等。在Golang中&a…

计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

C# 在PDF中添加和删除水印注释 (Watermark Annotation)

目录 使用工具 C# 在PDF文档中添加水印注释 C# 在PDF文档中删除水印注释 PDF中的水印注释是一种独特的注释类型&#xff0c;它通常以透明的文本或图片形式叠加在页面内容之上&#xff0c;为文档添加标识或信息提示。与传统的静态水印不同&#xff0c;水印注释并不会永久嵌入…

分析服务器 systemctl 启动gozero项目报错的解决方案

### 分析 systemctl start beisen.service 报错 在 Linux 系统中&#xff0c;systemctl 是管理系统和服务的主要工具。当我们尝试重启某个服务时&#xff0c;如果服务启动失败&#xff0c;systemctl 会输出错误信息&#xff0c;帮助我们诊断和解决问题。 本文将通过一个实际的…

Dubbo扩展点加载机制

加载机制中已经存在的一些关键注解&#xff0c;如SPI、©Adaptive> ©Activateo然后介绍整个加载机制中最核心的ExtensionLoader的工作流程及实现原理。最后介绍扩展中使用的类动态编译的实 现原理。 Java SPI Java 5 中的服务提供商https://docs.oracle.com/jav…

如何利用Logo设计免费生成器创建专业级Logo

在当今的商业世界中&#xff0c;一个好的Logo是品牌身份的象征&#xff0c;它承载着公司的形象与理念。设计一个专业级的Logo不再需要花费大量的金钱和时间&#xff0c;尤其是当我们拥有Logo设计免费生成器这样的工具时。接下来&#xff0c;让我们深入探讨如何利用这些工具来创…

游戏如何检测iOS越狱

不同于安卓的开源生态&#xff0c;iOS一直秉承着安全性更高的闭源生态&#xff0c;系统中的硬件、软件和服务会经过严格审核和测试&#xff0c;来保障安全性与稳定性。 据FairGurd观察&#xff0c;虽然iOS系统具备一定的安全性&#xff0c;但并非没有漏洞&#xff0c;如市面上…

智联视频超融合平台:电力行业的智能守护者

文章目录 一、远程实时监控与设备状态监测二、提高应急响应能力三、实现无人值守与减员增效四、保障电力设施安全与防范外部破坏五、提升电网运行管理效率与决策科学性六、助力电力企业数字化转型与智能化发展七、智联视频超融合平台 在当今数字化浪潮下&#xff0c;视频联网平…

卸载干净 IDEA(图文讲解)

目录 1、卸载 IDEA 程序 2、注册表清理 3、残留清理 1、卸载 IDEA 程序 点击屏幕左下角 Windows 图标 -> 设置-控制面板->intellij idea 勾选第一栏 Delete IntelliJ IDEA 2022.2 caches and local history&#xff0c;表示同时删除 IDEA 本地缓存以及历史。 Delete I…

计算机网络•自顶向下方法:路由选路算法

路由选路算法 在网络层中&#xff0c;选路是指数据包从源主机到目的主机的传输过程中&#xff0c;如何通过网络中的路由器选择一条合适的路径。路由器根据网络拓扑、路由表、协议规则等来决定如何将数据包转发到下一跳&#xff0c;直到数据包到达目的地。 选路算法分类 静态算…

Qemu配置QXL显卡支持分辨率

默认情况下&#xff0c;创建的vm的视频RAM限制为16MB。在win操作系统中分辨率最高就只能调到1024x768。 <video><model typecirrus vram16384 heads1 primaryyes/><address typepci domain0x0000 bus0x00 slot0x02 function0x0/> </video>单单修改ram…

【区块链】零知识证明基础概念详解

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 零知识证明基础概念详解引言1. 零知识证明的定义与特性1.1 基本定义1.2 三个核心…

Redis面试相关

Redis开篇 使用场景 缓存 缓存穿透 解决方法一&#xff1a; 方法二&#xff1a; 通过多次hash来获取对应的值。 小结 缓存击穿 缓存雪崩 打油诗 双写一致性 两种不同的要求 强一致 读锁代码 写锁代码 强一致&#xff0c;性能低。 延迟一致 方案一&#xff1a;消息队列 方…

以太网协议和LWIP协议详解

一、以太网协议简介 以太网是一种产生较早&#xff0c;使用相当广泛的局域网技术。目前以太网根据速度等级分类大概分为&#xff1a;标准以太网&#xff08;10Mbit/s&#xff09;&#xff0c;快速以太网&#xff08;100Mbit/s&#xff09;&#xff0c;千兆以太网&#xff08;1…

Qt|QWidget窗口支持旋转

功能实现&#xff1a;使用QWidget创建的窗口支持窗口旋转功能。 展示的示例中支持由水平方向旋转至垂直方向。至于其它角度旋转的问题&#xff0c;看完这篇文章后应该会很简单能实现的&#xff01; 开发环境&#xff1a;win VS2019 Qt 5.15.2 在实现之前也有想用使用 QProp…

微信小程序滑动解锁、滑动验证

微信小程序简单滑动解锁 效果 通过 movable-view &#xff08;可移动的视图容器&#xff0c;在页面中可以拖拽滑动&#xff09;实现的简单微信小程序滑动验证 movable-view 官方说明&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/movable-view.ht…

微服务实战——购物车模块实战

购物车 1. 数据模型分析 1.1. 需求描述 用户可以在登录状态下将商品添加到购物车【用户购物车/在线购物车】 放入数据库mongodb放入 redis&#xff08;采用&#xff09; 登录以后&#xff0c;会将临时购物车的数据全部合并过来&#xff0c;并清空临时购物车&#xff1b; 用…