【springboot】自定义starter

devtools/2024/9/20 7:25:06/ 标签: spring boot, java, spring

自定义一个starter,实现获取系统和程序信息。

0. 项目结构

org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件是用来加载自动配置类的,该文件必须放在META-INF/spring/目录下

1. 创建项目

        创建一个普通的maven项目,使用quickstart进行构建。

        这里需要注意jdk版本选择:springboot 2.0 需要选择jdk8+,springboot 3.0 需要选择jdk17+

2. 导入依赖

        导入父容器,进行版本控制;导入自动配置依赖,这是实现starter的核心依赖。

<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.huan</groupId><artifactId>myStart</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>myStart</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>
<!--  导入父容器,进行版本控制 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.8</version><relativePath/> <!-- lookup parent from repository --></parent><dependencies>
<!--   *** 导入自动配置依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
</project>

        这里我删掉了默认的测试依赖,所以需要删掉test类,不然后面打包会报错。

3. 创建属性结构类

        这里使用@ConfigurationProperties(prefix = "huan.system")注解,来绑定外部配置文件中的属性到 Java 类中。

        例如,可以通过在application.propertiesapplication.yml配置文件中配置“huan.system.copyright”和“huan.system.author”属性批量配置SystemInfoPro 类的 copyrightauthor 字段。

java">@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "huan.system")
public class SystemInfoPro {private String copyright;private String author;
}

4. 创建和实现工具接口

        创建接口。

java">public interface ISystemInfoUtil {public String getAppInfo();public String getSystemInfo();
}

        实现接口。

java">public class SystemInfoUtil implements ISystemInfoUtil{@Autowiredprivate SystemInfoPro systemInfoPro;@Autowiredprivate ConfigurableEnvironment env;@Overridepublic String getAppInfo() {return systemInfoPro.getCopyright()+"\t"+systemInfoPro.getAuthor();}@Overridepublic String getSystemInfo() {return env.getProperty("os.name")+"\t"+env.getProperty("user.home");}
}

5. 创建自动配置类

        自动配置类中使用@EnableConfigurationProperties注解使@ConfigurationProperties注解生效,并将指定的类注入到ioc容器中进行管理。并配合@Conditional注解,只有达到某种条件才会进行自动配置,避免不必要的配置和依赖问题。

java">@Configuration
@EnableConfigurationProperties({SystemInfoPro.class}) 
@ConditionalOnClass({SystemInfoPro.class,ISystemInfoUtil.class})
public class SystemInfoAutoConfiguration {//业务类的bean@Bean@ConditionalOnMissingBean({ISystemInfoUtil.class})//容器中没有ISystemInfoUtil类型的bean时,创建一个public ISystemInfoUtil systemInfoUtil(){System.out.println("创建了SystemInfoUtil类型的bean");return new SystemInfoUtil();}
}

6. 创建.imports 文件

        在resources/META-INF/spring/目录下创建org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,并引入自动配置类。

java"># 引入系统信息自动配置
com.huan.SystemInfoAutoConfiguration

        注意:当正确配置.imports文件后,图标会发生变化,如果没改,可能是结构出了问题,比如没有spring文件夹之类的。

7. 打包starter为非执行文件

        使用install进行打包,将jar放入本地仓库。

8. 使用starter

        1. 创建一个springboot项目

        2. 引入自定义starter依赖

        <dependency><groupId>com.huan</groupId><artifactId>myStart</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

        3. 创建控制类

        在控制类中注入工具类,并使用其方法。

java">@RestController
public class HelloController {@Autowiredprivate ISystemInfoUtil systemInfoUtil;@RequestMapping("/")public String index() {return systemInfoUtil.getSystemInfo()+"\n"+systemInfoUtil.getAppInfo();}
}

        4. 配置配置文件

java">huan.system.copyright=huan info company
huan.system.author=huan

        5. 启动springboot

        正确创建了SystemInfoUtil类型的bean。

        访问网页。


http://www.ppmy.cn/devtools/97233.html

相关文章

深入理解LDA主题模型及其在文本分析中的应用

深入理解LDA主题模型及其在文本分析中的应用 在自然语言处理领域,主题模型是一种强大的工具,能够自动发现文档集中的潜在主题。在大规模文本数据分析中,Latent Dirichlet Allocation (LDA) 是最受欢迎的主题模型之一。LDA的核心目标是从文档集中提取不同的主题,并确定每篇…

C语言 ——— 学习并使用calloc和realloc函数

目录 calloc函数的功能 学习并使用calloc函数​编辑 realloc函数的功能 学习并使用realloc函数​编辑 calloc函数的功能 calloc函数的功能和malloc函数的功能类似&#xff0c;于malloc函数的区别只在于calloc函数会再返回地址之前把申请的空间的每个字节初始化为全0 C语言…

STM32 HAL库常用功能封装

关中断 /*** brief 关闭所有中断(但是不包括fault和NMI中断)* param 无* retval 无*/ void sys_intx_disable(void) {__ASM volatile("cpsid i"); }开中断 /*** brief 开启所有中断* param 无* retval 无*/ void sys_intx_enabl…

【MATLAB机器人系统工具箱】【manipulatorRRT规划器】属性和方法解析

启用了连接启发式&#xff08;heuristic&#xff09;后&#xff0c;双向快速扩展随机树&#xff08;RRT&#xff09;算法会在以下情况下忽略 MAXCONNECTIONDISTANCE 的限制&#xff1a;当两棵树&#xff08;起始树和目标树&#xff09;之间的节点距离足够接近时&#xff0c;算法…

计算机Java项目|基于SpringBoot的大学生一体化服务平台的设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

【1】开源!移植OpenHarmony轻量系统到雅特力AT32F437ZMT MCU

笔者最近将OpenHarmony轻量系统移植到AT32F437 MCU&#xff0c;移植架构采用Board与SoC分离方案&#xff0c;使用arm gcc工具链Newlib C库&#xff0c;并且提供了相应的样例应用代码&#xff08;样例代码持续更新中&#xff09; 移植 基于雅特力科技官方开发板 AT-START-F437 …

flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案

flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案 一、背景二、分析tmp文件三、定位原因四、解决方法一、背景 flume没有关闭生成的tmp文件临时解决方案是批量关闭tmp文件下一步深入定位分析原因二、分析tmp文件 观察tmp文件,发现tmp文件的时间点…

Linux Bridge VLAN

一、Linux Bridge VLAN &#xff08;1&#xff09;是什么&#xff1f; Bridge 是什么 VLAN 是什么 LINUX BRIDGE VLAN又是什么&#xff1f;——> &#xff08;2&#xff09;解决什么问题&#xff1f;【应用场景】 应用背景 已一个实际问题引出 【应用场景】&#xff1a; 【…

武汉流星汇聚:西班牙时尚消费高涨,中国商家借亚马逊平台拓商机

在2024年第二季度的亚马逊西班牙站&#xff0c;一场前所未有的时尚盛宴正悄然上演。销售额同比高增长TOP10品类榜单的揭晓&#xff0c;不仅揭示了西班牙消费者对于时尚品类的狂热追求&#xff0c;更为亚马逊平台上的中国商家开启了一扇通往新蓝海的大门。其中&#xff0c;男士拳…

SSH协议与OpenSSH配置详解(配置密钥对验证实验)

文章目录 SSH 协议与 OpenSSH 配置详解1. SSH 协议概述2. OpenSSH 概述3. 配置SSH&#xff08;sshd_config文件&#xff09;3.1 配置服务监听选项3.2 配置用户登录控制&#xff08;黑白名单&#xff09;3.3 配置登录验证方式&#xff08;密钥对验证&#xff09;3.4 常用的配置项…

PHP中如何限制PDF文件大小的简单示例

例如&#xff0c;如果我们希望限制PDF文件的大小不超过5MB&#xff0c;我们可以将这两个配置项都设置为5M。 upload_max_filesize 5M post_max_size 5M接下来&#xff0c;在PHP脚本中&#xff0c;我们可以通过检查$_FILES全局数组来获取上传文件的大小&#xff0c;并作出相应…

【5.0】vue请求函数和路由

【5.0】vue请求函数和路由 此处是与后端交互发送请求拿到数据&#xff0c;和vue自己中的页面跳转路由 【一】axios使用 【1】安装 终端命令 npm install axios -S【2】基本语法 axios.get(后端地址&#xff08;django&#xff09;).then(res > {console.log(res.data.res…

ArrayList详解

简介 【概述】 List的主要实现类&#xff0c;底层使用Object[]存储&#xff0c;适用于频繁的查找工作&#xff0c;线程不安全。 【特点】 增删慢&#xff1a;每次删除元素&#xff0c;都需要更改数组长度、拷贝以及移动元素位置&#xff1b;查询快&#xff1a;由于数组在内…

SSM学生社团管理系统—计算机毕业设计源码20360

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 学生社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系…

YouTube最好用的翻译插件

相信很多同学和我一样&#xff0c;想看YouTube视频时发现基本上都说英文&#xff0c;以我的英文水平&#x1f923;去观看真是一言难尽&#xff0c;所以就想着看能不能在谷歌浏览器上找一个插件来进行翻译&#xff0c;结果还真让我找到了一个不错的Youtube翻译插件&#xff0c;它…

AI大模型高效题库生成:业务人效提升的强大助力

一 现状问题 1、培训考核涉及的文件数量较多 当前&#xff0c;京东航空公司维修部门面临着人员规模的快速增长和持续的培训需求。根据民航局的规定&#xff0c;维修培训必须确保所有维修人员都能够完成对飞机维修相关文件的学习&#xff0c;这包括维修方案、维修工程管理手册…

Anaconda环境迁移之conda pack

目录 1. conda pack安装2. 环境打包3. 拷贝环境包到目标电脑4. 激活环境5. 大功告成 1. conda pack安装 源电脑安装conda pack conda install conda-pack2. 环境打包 假如环境名为test&#xff0c;那么打包命令如下&#xff1a; conda pack -n test -o test.tar.gz打包后的…

使用Python+MoviePy给视频添加字幕或水印

一、使用CompositeVideoClip将使用TextClip创建文字类与视频叠加在一起&#xff0c;给视频添加字幕或水印 from moviepy.editor import *# 从本地载入视频myHolidays.mp4&#xff0c;并截取00:00:50 - 00:00:60部分 clip VideoFileClip("/home/Download/Mojito.mp4"…

如果忘记了 Apple ID 密码,如何重设

“我忘记了我的 Apple ID 密码&#xff0c;如何恢复我的帐户&#xff1f;”为了方便用户&#xff0c;Apple 允许每个人使用唯一的 Apple ID 和密码激活设备并访问所有 Apple 服务。然而&#xff0c;实际上&#xff0c;手动选择某项并忘记它似乎很容易。例如&#xff0c;许多 Ap…

带你速通C语言——指针(10)

指针是C语言中最强大但也最容易引起困惑的概念之一。它们直接关联内存管理&#xff0c;使得程序员可以高效地操作数据和内存。下面我将尽量以简单明了的方式介绍指针的基本概念。 1.指针基础 指针本质上是存储内存地址的变量&#xff0c;这个地址指向一个值。通过指针&#xf…