学校网站建设计入哪个会计科目/今日热搜排行第一名
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;}@Beanpublic 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@ConditionalOnMissingBeanpublic 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 {@Overridepublic 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);}@Autowiredprivate 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应用程序,并在其中引入自定义启动器的依赖项。具体的步骤如下:
-
在Maven项目的根目录下运行mvn clean install命令,将自定义启动器打包成一个可执行的jar包,并安装到本地Maven仓库中。
-
创建一个新的Spring Boot应用程序,并在pom.xml文件中添加自定义启动器的依赖项,具体如下:
<dependency><groupId>com.example</groupId><artifactId>my-starter-spring-boot-starter</artifactId><version>1.0.0-SNAPSHOT</version>
</dependency>
- 在应用程序的配置文件(例如application.yml)中,可以使用my.starter前缀来配置自定义启动器的属性值,具体如下:
my:starter:message: "Hello, Spring Boot!"
- 在应用程序中,可以通过@Autowired注解注入自定义启动器提供的Bean,并调用其中的方法,具体如下:
@Autowired
private MyStarterService myStarterService;@GetMapping("/hello")
public String sayHello() {return myStarterService.sayHello();
}
- 启动应用程序,并访问http://localhost:8080/hello,可以看到浏览器中显示的字符串为"Hello, Spring Boot!"。
总结
在本文中,我们介绍了如何实现自定义Spring Boot启动器,包括创建自动配置类、配置属性类和自定义启动器类,并演示了如何在示例应用程序中使用自定义启动器。自定义启动器可以帮助我们封装常用的配置和Bean,并提供给其他应用程序使用,从而提高开发效率和代码复用性。
相关文章:

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

【面试题HTTP中的两种请求方法】GET 和 POST 有什么区别?
GET 和 POST 有什么区别? 1.相同点和最本质的区别1.1 相同点1.2 最本质的区别 2.非本质区别2.1 缓存不同2.2 参数长度限制不同2.3 回退和刷新不同2.4 历史记录不同2.5 书签不同 总结代码示例 GET 和 POST 是 HTTP 请求中最常用的两种请求方法,在日常开发…...

Allegro16.6详细教程(三)
確定Pad的層面 (1)用Single layer mode開關來控制pad type 勾選Single layer mode,則pad為單面孔,比如SMD 不勾選Single layer mode,則pad為通孔,比如:via (2)用滑鼠左鍵點選BEGIN LAYER彈出下面3個欄位 Regular, Thermal Relief, Anti Pad;Regular用於正片,Thermal R…...

Python3数据分析与挖掘建模(6)离散分布分析示例
1. 离散分布分析示例 相关库: pandas详细用法 numpy详细用法 1.1 引入算法库 # 引入 pandas库 import pandas as pd # 引入 numpy库 import numpy as np# 读取数据 dfpd.read_csv("data/HR.csv")# 查看数据 df Out[6]: satisfaction_level last_eval…...

汇编语言程序设计基础知识二
五、顺序结构 1、程序设计的步骤 1、分析问题 2、建立数据模型 3、设计算法 4、编制程序 5、上机调试 2、流程图的应用 3、程序的基本控制结构 1、顺序结构:程序顺序执行,不发生跳转 2、分支结构:程序在执行过程中发生跳转 3、循环…...

一文详解!Robot Framework Selenium UI自动化测试入门篇
目录 前言: 自动化框架的选择 测试环境的搭建 导入Selenium2Library包 关键字是什么? 创建测试用例 前言: 自动化测试的重要性越来越受到人们的重视,因为它可以提高测试效率、降低测试成本并减少人为错误的出现。为了满足这…...

Java 9 模块化系统详解
Java 9 模块化系统详解 一、简介1. 引入模块化系统原因2. 模块化系统带来的优势和挑战3. 模块化关键概念 二、模块化基础1. 模块化源代码结构规范2. 模块定义与描述符3. 打包可执行模块 三、模块化系统的高级特性1. 模块发现与解决依赖2. 模块化升级与替换3. 模块化动态访问 四…...

Windows定时执行Python脚本
在Linux环境下我们可以使用crontab工具来定时的执行脚本,可以很轻松的管理各个虚拟环境下的py文件在Windows上可以使用任务计划程序来定时执行我们的脚本 关于这个的基本使用可以查看我前面的博客 https://blog.csdn.net/wyh1618/article/details/125725967?spm10…...

数据科学简介:如何使用 Pandas 库处理 CSV 文件
部分数据来源:ChatGPT 什么是 CSV 文件? CSV ( Comma Separated Values)文件是一种常见的文本文件格式,它通常用于存储结构化数据,因为它可以轻松地转换成电子表格,如Excel。 CSV 文件是以逗号作为分隔符的表格数据。文件中的每行代表一个记录,每列代表一个属性。例如…...

面试专题:java多线程(2)-- 线程池
1.为什么要用线程池? 线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。 这里借用《Java并发编程的艺术》提到的来说一下使用线程池的好处: 降低资源消…...

Linux文件权限及用户管理
文件权限 在Linux中,每个文件和目录都有一组权限,这些权限决定了哪些用户可以访问文件或目录,以及他们可以进行什么样的操作。权限分为三类: 所有者权限:这些权限适用于文件或目录的所有者。 组权限:这些…...

以AI为灯,照亮医疗放射防护监管盲区
相信绝大部分人都有在医院拍X光片的经历,它能够让医生更方便快速地找出潜在问题,判断病人健康状况,是医疗诊断过程中的常见检查方式。但同时X射线也是一把双刃剑,它的照射量可在体内累积,对人体血液白细胞有杀伤力&…...

Golang单元测试详解(一):单元测试的基本使用方法
Golang 单元测试 Golang 中的单元测试是使用标准库 testing 来实现的,编写一个单元测试是很容易的: 创建测试文件:在 Go 项目的源代码目录下创建一个新的文件(和被测代码文件在同一个包),以 _test.go 为后…...

数据库的序列
目录 一、序列是什么 二、序列的用途 二、创建序列 三、查看、修改、删除序列 四、使用序列 (1)在插入语句中使用 (2)不在插入语句中使用 五、使用序列的例子 一、序列是什么 数据库对象分为:用户、视图、索引…...

2022年回顾
年总写完了(已持续多年),顺便写个小的回顾。 寻找属于自己的方向 无论当前干啥,大多数都不是真正适合你的,但是,你又不能不做下去,那么,持续的寻找适合的,就是一种解开…...

40亿个QQ号,限制1G内存,如何去重?
40亿个unsigned int,如果直接用内存存储的话,需要: 4*4000000000 /1024/1024/1024 14.9G ,考虑到其中有一些重复的话,那1G的空间也基本上是不够用的。 想要实现这个功能,可以借助位图。 使用位图的话&a…...

【django】django的orm的分组查询
前言:django当中分组查询如何实现? annotate from myapp import models from django.db.models.functions import TruncMonth from django.db.models import Count,Avg# 分组 values 就是取值作用 model.Book.objects.values(month).annotate(countCo…...

MySQL5.8在Windows下下载+安装+配置教程
MySQL是一款常用的关系型数据库管理系统,本文将介绍MySQL5.8在Windows下的安装配置教程。 1. 软件下载地址 免安装版下载地址:https://dev.mysql.com/downloads/mysql/安装版下载地址:https://dev.mysql.com/downloads/installer/ 2. 免安…...

Flask or FastAPI? Python服务端初体验
1. 引言 最近由于工作需要,又去了解了一下简单的python服务搭建的相关工作,主要是为了自己开发的模型或者工具给同组的人使用。之前介绍的针对于数据科学研究比较友好的一个可以展示的前端框架Streamlit可以说是一个利器。不过,随着ChatGPT的…...

《计算机组成原理》唐朔飞 第7章 指令系统 - 学习笔记
写在前面的话:此系列文章为笔者学习计算机组成原理时的个人笔记,分享出来与大家学习交流。使用教材为唐朔飞第3版,笔记目录大体与教材相同。 网课 计算机组成原理(哈工大刘宏伟)135讲(全)高清_…...

Linux:apache网页优化
Linux:apache网页优化 一、Apache 网页优化二、网页压缩2.1 检查是否安装 mod_deflate 模块2.2 如果没有安装mod_deflate 模块,重新编译安装 Apache 添加 mod_deflate 模块2.3 配置 mod_deflate 模块启用2.4 检查安装情况,启动服务2.5 测试 m…...

涨点技巧:注意力机制---Yolov8引入Resnet_CBAM,CBAM升级版
1.计算机视觉中的注意力机制 一般来说,注意力机制通常被分为以下基本四大类: 通道注意力 Channel Attention 空间注意力机制 Spatial Attention 时间注意力机制 Temporal Attention 分支注意力机制 Branch Attention 1.1.CBAM:通道注意力和空间注意力的集成者 轻量级…...

solr教程
一:安装配置 下载完成之后,解压solr文件,解压tomcat 1.1 在tomcat安装solr,并且建立solrCore 把solr5.5目录下的server/solr-webapp/webapp 重命名为solr,并且放置到tomcat/webapp的目录下。 打开tomcat/webapp/solr/WEB-INF/web.xml新建…...

基于java语言编写的爬虫程序
Java语言可以使用Jsoup、HttpClient等库进行网络爬虫开发,其中Jsoup提供了HTML解析和DOM操作的功能,HttpClient则提供了HTTP协议的支持。你可以通过使用这些库,构建网络爬虫程序来爬取指定网站的数据。需要注意的是,应该遵守网站的…...

UM2082F08 125k三通道低频无线唤醒ASK接收功能的SOC芯片 汽车PKE钥匙
1产品描述 UM2082F08是基于单周期8051内核的超低功耗8位、具有三通道低频无线唤醒ASK接收功能的SOC芯片。芯片可检测30KHz~300KHz范围的LF (低频)载波频率数据并触发唤醒信号,同时可以调节接收灵敏度,确保在各种应用环境下实现可靠唤醒,其拥…...

【SpringBoot_Project_Actual combat】 Summary of Project experience_需要考虑的问题
无论是初学者还是有经验的专业人士,在学习一门新的IT技术时,都需要采取一种系统性的学习方法。那么作为一名技术er,你是如何系统的学习it技术的呢。 一、DB Problems 数据库数据类型与java中数据类型对应问题? MySql数据库和java…...

恒容容器放气的瞬时流量的计算与合金氢化物放氢流量曲线的计算
有时候,你会遇到一个问题,该问题的描述如下: 你有一个已知体积的容器,设容器体积为V,里面装有一定压力(初始压力)的气体,如空气或氢气等,设初始压力为1MPa,容器出口连接着一个阀门开…...

网络编程_UDP通信
网络编程_UDP通信 1. TCP与UDP2. 使用UDP通信3. sendto与recvfrom、recv4.实例实例1: 服务器接收、客户端发送实例2:服务器收发、客户方发送、接收。1. TCP与UDP 当使用网络套接字通信时, 套接字的“域”都取AF_INET; 套接字的type: SOCK_STREAM 此时,默认使用TCP协议进行…...

windows修改Pycharm的右键打开方式
title: windows中open floder as Pycharm太长了怎么修改 date: 2023-06-04 author: IoT_H2 tags: windows系统问题 categories: Markdown 问题描述: Pycharm这一栏这么长,长的我实在是很难受,事实上Jetbrains家的软件都是这个鸟模样 导…...

Python入门(十四)函数(二)
函数(二) 1.传递实参1.1 位置实参1.2 关键字实参1.3 默认值 作者:xiou 1.传递实参 函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多:可使用位置实参,这要求实参…...