当前位置: 首页 > news >正文

SpringBoot如何自定义Starter ?

大家好,我是锋哥。今天分享关于【SpringBoot如何自定义Starter ?】面试题。希望对大家有帮助;

SpringBoot如何自定义Starter ?

1000道 互联网大厂Java工程师 精选面试题-Java资源分享网

在 Spring Boot 中,自定义 Starter 是一种将应用程序的特定功能封装为可复用组件的方式。通过创建一个自定义的 Starter,可以将常用的配置、功能和依赖项集中在一起,以便其他应用程序通过简单的引入依赖即可使用。自定义 Starter 主要包括以下几个步骤:

1. 创建自定义 Starter 项目

首先,创建一个新的 Maven 项目作为自定义 Starter 的基础。

(1) 初始化 Maven 项目

你可以使用 Spring Initializr 或手动创建一个 Maven 项目。确保在项目的 pom.xml 中添加适当的依赖。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>
</dependencies>
(2) 项目结构

通常,自定义 Starter 项目的结构如下:

my-spring-boot-starter
├── src
│   └── main
│       └── java
│           └── com
│               └── example
│                   └── starter
│                       ├── MyCustomStarterAutoConfiguration.java
│                       └── MyService.java
└── pom.xml

2. 创建自动配置类

Spring Boot 的 Starter 依赖于自动配置类,自动配置类用来提供相关的配置和 Bean。自定义 Starter 的核心是创建一个自动配置类。

(1) 创建自动配置类

自动配置类负责根据类路径中的可用类、配置属性等自动配置 Bean。例如,你可以创建一个 MyCustomStarterAutoConfiguration 类。

package com.example.starter;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@ConditionalOnClass(MyService.class)  // 只有在 classpath 中存在 MyService 时才进行配置
public class MyCustomStarterAutoConfiguration {@Beanpublic MyService myService() {return new MyService();}
}

在这个类中:

  • @Configuration 标注表明这是一个 Spring 配置类。
  • @ConditionalOnClass 注解用于判断某个类是否在类路径中。如果存在该类,则进行配置。
  • @Bean 注解用于注册一个 MyService 实例。
(2) 创建服务类

你可以在自定义 Starter 中提供一些通用的服务类(如 MyService):

package com.example.starter;public class MyService {public void doSomething() {System.out.println("Doing something in MyService...");}
}

3. 创建 spring.factories 文件

为了让 Spring Boot 能够识别并加载你的自动配置类,你需要在 META-INF/spring.factories 文件中注册你的自动配置类。

src/main/resources/META-INF/ 目录下创建一个 spring.factories 文件,并将自动配置类添加到其中:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.starter.MyCustomStarterAutoConfiguration

4. 创建 Starter 的依赖关系

pom.xml 中,你需要添加 Spring Boot 自动配置的依赖项,并确保该模块作为一个可发布的依赖项。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency>
</dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.1.0</version><configuration><archive><manifestEntries><Spring-Boot-Autoconfigure>com.example.starter.MyCustomStarterAutoConfiguration</Spring-Boot-Autoconfigure></manifestEntries></archive></configuration></plugin></plugins>
</build>

5. 打包和发布 Starter

完成自定义 Starter 的开发后,你可以通过 Maven 构建项目并将其打包发布到本地或远程仓库(如 Maven Central 或私有仓库)。

mvn clean install

6. 在 Spring Boot 应用中使用自定义 Starter

使用自定义 Starter 非常简单,只需将其添加到应用程序的 pom.xml 中作为依赖:

<dependencies><dependency><groupId>com.example</groupId><artifactId>my-spring-boot-starter</artifactId><version>1.0.0</version></dependency>
</dependencies>

Spring Boot 会自动扫描并加载 Starter 提供的自动配置类,并根据需要创建相关的 Bean。

7. 可选:提供配置属性

有时候,你可能希望自定义 Starter 能够接受配置属性。你可以在自动配置类中使用 @ConfigurationProperties 注解来绑定外部配置(如 application.propertiesapplication.yml)中的值。

package com.example.starter;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "myservice")
public class MyServiceProperties {private String message;// getters and setters
}

然后在自动配置类中将该配置属性注入到相关的 Bean 中:

@Bean
public MyService myService(MyServiceProperties properties) {MyService service = new MyService();service.setMessage(properties.getMessage());return service;
}

application.propertiesapplication.yml 中,可以定义该属性:

myservice.message=Hello, Custom Service!

总结

创建一个自定义 Starter 主要涉及以下几个步骤:

  1. 创建自动配置类,用于提供 Starter 的功能和配置。
  2. 使用 spring.factories 文件注册自动配置类。
  3. 打包并发布 Starter。
  4. 在目标应用中通过引入依赖来使用自定义 Starter。

通过这种方式,Spring Boot 提供了一个灵活的机制来封装常用功能和配置,使得其他项目可以更轻松地复用这些功能。

http://www.lryc.cn/news/525126.html

相关文章:

  • 前沿技术对比:大模型技术为什么发展远快于区块链技术,中英对照解释
  • WordPress果果对象存储插件
  • elk 安装
  • Python 预训练:打通视觉与大语言模型应用壁垒——Python预训练视觉和大语言模型
  • OpenCV相机标定与3D重建(63)校正图像的畸变函数undistort()的使用
  • 用 Java 发送 HTML 内容并带附件的电子邮件
  • 【Day24 LeetCode】贪心Ⅱ
  • vue3+elementPlus之后台管理系统(从0到1)(day3-管理员管理)
  • 上位机知识篇---ROS2命令行命令静态链接库动态链接库
  • 2025/1/21 学习Vue的第四天
  • 云计算、AI与国产化浪潮下DBA职业之路风云变幻,如何谋破局启新途?
  • Linux内核编程(二十一)USB驱动开发-键盘驱动
  • 模拟算法习题篇
  • 蓝桥杯真题 - 翻转 - 题解
  • IP属地与视频定位位置不一致:现象解析与影响探讨
  • 管道符、重定向与环境变量
  • 可扩展性设计架构模式——开闭原则
  • 算法随笔_17: 回文数
  • 计算机的错误计算(二百一十九)
  • React进阶之高阶组件HOC、react hooks、自定义hooks
  • 【Pytest】基础到高级功能的理解使用
  • RHCE实验详解
  • 备赛蓝桥杯之第十五届职业院校组省赛第二题:分享点滴
  • MyBatis 注解开发详解
  • Kivy App开发之UX控件VideoPlayer视频播放
  • 简单排序算法
  • C语言初阶牛客网刷题——JZ17 打印从1到最大的n位数【难度:入门】
  • 基于springboot+vue的校园二手物品交易系统的设计与实现
  • 开发环境搭建-2:配置 python 运行环境(使用 uv 管理 python 项目)
  • STM32 ST7735 128*160