Spring Boot如何实现自定义Spring Boot启动器

news2024/9/21 0:35:24

Spring Boot如何实现自定义Spring Boot启动器

在Spring Boot中,启动器(Starter)是一组依赖项的集合,它们一起提供了某个特定的功能。使用Spring Boot启动器可以让我们更加方便地集成第三方库和框架,并且可以避免版本冲突等问题。在本文中,我们将介绍如何实现自定义Spring Boot启动器,并提供一个示例代码。

在这里插入图片描述

什么是Spring Boot启动器

Spring Boot启动器是一组依赖项的集合,它们一起提供了某个特定的功能。启动器通常包括一组依赖项和一些默认的配置信息,它们可以帮助我们更加方便地集成第三方库和框架,并且可以避免版本冲突等问题。

Spring Boot提供了很多内置的启动器,例如spring-boot-starter-web、spring-boot-starter-data-jpa等。这些启动器可以帮助我们快速地搭建一个Web应用程序或者一个数据访问层,而无需手动配置依赖项和默认配置信息。

自定义Spring Boot启动器

除了可以使用Spring Boot内置的启动器外,我们还可以自己定义一个Spring Boot启动器。自定义Spring Boot启动器可以帮助我们更加方便地集成第三方库和框架,并且可以提高应用程序的可维护性和可扩展性。下面,我们将介绍如何实现自定义Spring Boot启动器,并提供一个示例代码。

创建Maven项目

首先,我们需要创建一个Maven项目,并添加必要的依赖项和插件。在pom.xml文件中,我们需要添加spring-boot-starter-parent、spring-boot-starter-test等Spring Boot相关的依赖项,以及maven-assembly-plugin插件和spring-boot-maven-plugin插件。具体的pom.xml文件内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>my-starter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>My Starter</name>
    <description>My custom Spring Boot starter</description>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.0</version>
        <relativePath/>
    </parent>
    
    <dependencies>
        <!-- Add your dependencies here -->
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.example.MyStarterApplication</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </executions>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

创建自定义配置类

接下来,我们需要创建一个自定义的配置类,用于定义一些默认的配置信息。在该配置类中,我们可以使用@Configuration注解和@Bean注解来定义一些Bean,以及使用@ConfigurationProperties注解来绑定配置文件中的属性值。具体的代码如下:

@Configuration
@ConfigurationProperties(prefix = "my.starter")
public class MyStarterAutoConfiguration {
    private String message = "Hello, World!";

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Bean
    public MyStarterService myStarterService() {
        return new MyStarterService(message);
    }
}

在上述代码中,我们创建了一个名为MyStarterAutoConfiguration的配置类,并使用@ConfigurationProperties注解绑定了配置文件中的my.starter前缀的属性值。我们还定义了一个名为myStarterService的Bean,并使用@Bean注解将该Bean注册到Spring容器中。

创建自定义启动器在自定义配置类之后,我们需要创建自定义的启动器。在Spring Boot中,启动器通常以spring-boot-starter-*的命名格式命名。因此,在本文中,我们将创建一个名为my-starter-spring-boot-starter的自定义启动器。

创建启动器项目

我们首先需要在Maven项目中创建一个新的模块,用于存放自定义启动器的代码。在该模块中,我们需要创建一个名为my-starter-spring-boot-starter的Maven项目,并添加必要的依赖项和插件。具体的pom.xml文件内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
	    <groupId>com.example</groupId>
	    <artifactId>my-starter</artifactId>
	    <version>1.0.0-SNAPSHOT</version>
    </parent>
    <artifactId>my-starter-spring-boot-starter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>My Starter Spring Boot Starter</name>
    <description>My custom Spring Boot starter</description>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>2.6.0</version>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>my-starter</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.example.MyStarterApplication</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

在上述代码中,我们创建了一个名为my-starter-spring-boot-starter的Maven项目,并添加了spring-boot-autoconfigure和my-starter的依赖项。这些依赖项将帮助我们自定义启动器和自动配置类。

创建自动配置类

接下来,我们需要在自定义启动器模块中创建一个自动配置类,用于定义自定义启动器提供的功能。在该自动配置类中,我们可以使用@Configuration注解和@ConditionalOnClass注解来定义一些Bean,并使用@Bean注解将这些Bean注册到Spring容器中。具体的代码如下:

@Configuration
@ConditionalOnClass(MyStarterService.class)
@EnableConfigurationProperties(MyStarterProperties.class)
public class MyStarterAutoConfiguration {
    private final MyStarterProperties properties;

    public MyStarterAutoConfiguration(MyStarterProperties properties) {
        this.properties = properties;
    }

    @Bean
    @ConditionalOnMissingBean
    public MyStarterService myStarterService() {
        return new MyStarterService(properties.getMessage());
    }
}

在上述代码中,我们创建了一个名为MyStarterAutoConfiguration的自动配置类,并使用@ConditionalOnClass注解来判断当前应用程序是否存在MyStarterService类。如果存在该类,则该自动配置类才会生效。

另外,我们还使用@EnableConfigurationProperties注解来启用配置属性类MyStarterProperties,并在构造函数中注入该类。我们还定义了一个名为myStarterService的Bean,并使用@Bean注解将该Bean注册到Spring容器中。在这里,我们使用@ConditionalOnMissingBean注解来判断是否已经存在名为myStarterService的Bean。如果不存在,则创建一个新的Bean。

创建配置属性类

除了自动配置类外,我们还需要创建一个配置属性类,用于定义自定义启动器的属性值。在该类中,我们可以使用@ConfigurationProperties注解来绑定属性值。具体的代码如下:

@ConfigurationProperties(prefix = "my.starter")
public class MyStarterProperties {
    private String message = "Hello, World!";

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

在上述代码中,我们创建了一个名为MyStarterProperties的配置属性类,并使用@ConfigurationProperties注解绑定了配置文件中的my.starter前缀的属性值。其中,message属性的默认值为"Hello,World!"。

创建自定义启动器类

最后,我们需要创建一个自定义启动器类,用于将自定义启动器的自动配置类和配置属性类注册到Spring容器中。在该类中,我们可以使用@EnableAutoConfiguration注解和@Import注解来注册自动配置类和配置属性类。具体的代码如下:

@Configuration
@EnableAutoConfiguration
@Import({MyStarterAutoConfiguration.class, MyStarterProperties.class})
public class MyStarterAutoConfigurationImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{
                MyStarterAutoConfiguration.class.getName(),
                MyStarterProperties.class.getName()
        };
    }
}

在上述代码中,我们创建了一个名为MyStarterAutoConfigurationImportSelector的自定义启动器类,并使用@EnableAutoConfiguration注解和@Import注解将自动配置类和配置属性类注册到Spring容器中。另外,我们还实现了ImportSelector接口,并重写了selectImports方法,用于返回需要导入的类的全限定名数组。

创建示例应用程序

最后,我们需要创建一个示例应用程序,用于演示如何使用自定义启动器。在该应用程序中,我们可以直接引入自定义启动器的依赖项,然后使用自定义的配置属性和Bean。具体的代码如下:

@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }

    @Autowired
    private MyStarterService myStarterService;

    @GetMapping("/hello")
    public String sayHello() {
        return myStarterService.sayHello();
    }
}

在上述代码中,我们创建了一个名为MyApp的Spring Boot应用程序,并在其中注入了自定义启动器提供的Bean myStarterService。在sayHello方法中,我们调用myStarterService的sayHello方法,返回一个字符串。

测试自定义启动器

现在,我们可以使用mvn clean install命令将自定义启动器打包成一个可执行的jar包,并将其安装到本地Maven仓库中。然后,我们可以创建一个新的Spring Boot应用程序,并在其中引入自定义启动器的依赖项。具体的步骤如下:

  1. 在Maven项目的根目录下运行mvn clean install命令,将自定义启动器打包成一个可执行的jar包,并安装到本地Maven仓库中。

  2. 创建一个新的Spring Boot应用程序,并在pom.xml文件中添加自定义启动器的依赖项,具体如下:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>my-starter-spring-boot-starter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>
  1. 在应用程序的配置文件(例如application.yml)中,可以使用my.starter前缀来配置自定义启动器的属性值,具体如下:
my:
  starter:
    message: "Hello, Spring Boot!"
  1. 在应用程序中,可以通过@Autowired注解注入自定义启动器提供的Bean,并调用其中的方法,具体如下:
@Autowired
private MyStarterService myStarterService;

@GetMapping("/hello")
public String sayHello() {
    return myStarterService.sayHello();
}
  1. 启动应用程序,并访问http://localhost:8080/hello,可以看到浏览器中显示的字符串为"Hello, Spring Boot!"。

总结

在本文中,我们介绍了如何实现自定义Spring Boot启动器,包括创建自动配置类、配置属性类和自定义启动器类,并演示了如何在示例应用程序中使用自定义启动器。自定义启动器可以帮助我们封装常用的配置和Bean,并提供给其他应用程序使用,从而提高开发效率和代码复用性。

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

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

相关文章

2023年京东618预售数据重磅出炉!(大家电篇:预售额550亿)

2023年5月23日至5月31日&#xff0c;京东618预售期正式落幕。今年的预售&#xff0c;不少行业及品牌首战告捷&#xff0c;拿下了不错的成绩。 数据统计时间&#xff1a;5月23日至5月30日 平台&#xff1a;京东 今晚&#xff0c;鲸参谋率先来盘点一下大家电行业在23日至30日预售…

知名大厂的UI组件库有哪些?

以下是 5 款优秀的 UI 设计组件库的推荐&#xff0c;这些组件库都可以免费获取&#xff0c;帮助你解答疑惑&#xff0c;提供设计参考&#xff0c;并提高工作效率 1、MUI&#xff08;Material-UI&#xff09; 包含 60 类别的 UI 设计组件&#xff0c;可在即时设计资源广场一…

开源!AREX接口自动化回归测试的全过程

AREX是一款开源的基于真实请求与数据的自动化回归测试平台&#xff08;项目地址&#xff1a;https://github.com/arextest&#xff09;&#xff0c;利用JavaAgent技术与比对技术&#xff0c;通过流量录制回放能力实现快速有效的回归测试。同时提供了接口测试、接口比对测试等丰…

Sentinel 介绍及整合OPenFeign及GateWay

Sentinel 介绍 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景&#xff1a; Sentinel 承接了阿里巴巴近…

IDEA 插件上新! 生成接口文档就是这么快!

当有接口对接需求的时候&#xff0c;开发终于不用再担心 API 文档难写了&#xff0c;也不用再一个个接口文档重新写&#xff01;安装这个 IDEA 插件&#xff0c;可以一步将文档导入到 Postcat。 这款插件操作简单&#xff0c;容易上手&#xff0c;能够让开发者省去API文档编写的…

STM32G0x0系列-软件定时器解决HAL_Delay问题

目录 HAL_Delay函数源码 软件定时器 创建工程试验 1.将对应文件移动到项目位置 2.添加现有文件放到工程中 3.重定向printf 3.验证自己的软件定时器 4.查看现象 HAL_Delay函数使用了中断机制来实现延时功能&#xff0c;当在中断函数中调用HAL_Delay函数需要考虑中断优先…

《操作系统》by李治军 | 实验5.pre - copy_process 代码详解

目录 【前言】 代码分析 1. 申请子进程 PCB 空间 2. 找到子进程的内核栈 3. 父子进程共用同一内存、堆栈和数据代码块 4. 相关寄存器入栈 5. switch_to 返回位置 6. 响应 switch_to 的弹栈工作 7. 更新子进程 PCB 8. 子进程切换流程 【前言】 在李治军老师的《操作系…

MyBatis——缓存

是一种临时存储少量数据至内存或者是磁盘的一种技术.减少数据的加载次数,可以降低工作量,提高程序响应速度 缓存的重要性是不言而喻的。mybatis的缓存将相同查询条件的SQL语句执行一遍后所得到的结果存在内存或者某种缓存介质当中&#xff0c;当下次遇到一模一样的查询SQL时候…

Yolov8涨点神器:ODConv+ConvNeXt提升小目标检测能力

1.涨点神器结合,助力YOLO 1.1 ICLR 2022涨点神器——即插即用的动态卷积ODConv 论文:Omni-Dimensional Dynamic Convolution 论文地址:Omni-Dimensional Dynamic Convolution | OpenReview ODConv通过并行策略引入一种多维注意力机制以对卷积核空间的四个维度学习更灵活的…

项目所需的Python版本+国内源+虚拟环境+用Conda创建环境

文章目录 &#xff08;一&#xff09;Python&#xff08;1.1&#xff09;国内源&#xff08;1.2&#xff09;设置源&#xff08;全局&#xff09;&#xff08;1.3&#xff09;使用源&#xff08;单次&#xff09; &#xff08;二&#xff09;Python环境&#xff08;2.1&#xf…

【数据结构与算法】力扣:栈和队列(一)

1 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回队列开…

vue diff算法与虚拟dom知识整理(13) 手写patch子节点更新换位策略

上一文中我们编写了 patch中新旧节点都有子节点的 插入节点的逻辑 但旧节点的子节点发生顺序 或数量变化 我们还没有处理 那我们现在继续 我们先来看看 原本是怎么写的 我们打开我们的案例 找到 node_modules 下面的snabbdom/src下面的 init.ts文件 我们在里面找到一个 updat…

Openai+Deeplearning.AI: ChatGPT Prompt Engineering(六)

想和大家分享一下最近学习的Deeplearning.AI和openai联合打造ChatGPT Prompt Engineering在线课程.以下是我写的关于该课程的前五篇博客&#xff1a; ChatGPT Prompt Engineering(一)ChatGPT Prompt Engineering(二)ChatGPT Prompt Engineering(三)ChatGPT Prompt Engineering…

QML Text 元素

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在 QML 中,Text 和 Label 是两种常用的元素(Label 继承于 Text),用于显示文本内容。虽然它们看起来很相似,但在使用和功能上有一些不同。 对于 Text 元素,比较重要的是 text 与 font 属性,一旦指定了…

Linux常见IO模型-3

在前两篇博客中&#xff0c;我们讲述了常见的IO模型&#xff0c;并对多路转接模型中的select模型进行了细致介绍和具体的代码实现。那么接下来&#xff0c;我们在本篇博客中将对剩余的多路转接模型中的&#xff1a;poll和epoll进行介绍。 目录 1.poll 1.1操作流程 1.2代码实…

硬件系统工程师宝典(27)-----MOSFET、BJT搭配,干活不累

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。上篇我们说到场效应管的原理是通过“监测”栅极和源极间电压来实现控制漏极-源极之间电流的目的。今天我们来讲讲场效应管如何和BJT搭配设计控制电路…

【P44】JMeter 模块控制器(Module Controller)

文章目录 一、模块控制器&#xff08;Module Controller&#xff09;参数说明二、测试计划设计 一、模块控制器&#xff08;Module Controller&#xff09;参数说明 提供了一种在运行时将测试计划片段替换为当前测试计划的机制&#xff1b;模块控制器的目标是为增加脚本的复用…

springboot+vue实验室预约设备报修管理系统

本实验室管理系统管理员功能有个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;公告信息管理&#xff0c;知识库管理&#xff0c;实验课程管理&#xff0c;实验室信息管理&#xff0c;实验室预约管理&#xff0c;实验设备管理&#xff0c;采购记录管理&#xff0…

addon.MediaStream,erizo::MediaStream 还有addon.MediaXXX,erizo::MediaXXX

9. MediaStream 和erizo::MediaStream 类的继承关系 erizo::MediaStream source/agent/webrtc/rtcConn/erizo/src/erizo/MediaStream.h source/agent/webrtc/rtcConn/erizo/src/erizo/MediaDefinitions.h erizo::MediaSource source/agent/webrtc/rtcConn/erizo/src/erizo/…