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

SpringBoot:手写一个 SpringBoot Starter

  • 声明:原文作者:yuan_404

文章目录

  • 1. 说明
  • 2 . 编写启动器
  • 3 . 新建项目测试自己写的启动器

1. 说明

  • 启动器模块是一个 空 jar 文件,仅提供辅助性依赖管理,这些依赖可能用于自动装配或者其他类库

命名归约:

  • 官方命名:

    • 前缀:spring-boot-starter-xxx
    • 比如:spring-boot-starter-web…
  • 自定义命名:

    • xxx-spring-boot-starter
    • 比如:mybatis-spring-boot-starter

2 . 编写启动器

  1. 在IDEA中新建一个空项目 spring-boot-starter-diy

  2. 新建一个普通Maven模块:demo-spring-boot-starter

  3. 新建一个Springboot模块:demo-spring-boot-starter-autoconfigure

  4. 点击apply即可,基本结构

  5. 在starter 中 导入 autoconfigure 的依赖

    <!-- 启动器 -->
    <dependencies><!--  引入自动配置模块 --><dependency><groupId>com.demo</groupId><artifactId>demo-spring-boot-starter-autoconfigure</artifactId><version>0.0.1-SNAPSHOT</version></dependency>
    </dependencies>
  6. 将 autoconfigure 项目下,Pom中加入依赖

     <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency>
    </dependencies>

    说明:
    第一个依赖 主要是为编译器配置的 可以根据properties 鼠标右键 点到用这个属性的类上个

    第二个依赖 主要是为了自动装配

  7. 编写HelloProperties 配置类

    // 前缀 demo.hello
    @ConfigurationProperties(prefix = "demo.hello")
    public class HelloProperties {private String prefix;private String suffix;public String getPrefix() {return prefix;}public void setPrefix(String prefix) {this.prefix = prefix;}public String getSuffix() {return suffix;}public void setSuffix(String suffix) {this.suffix = suffix;}
    }

    这里我们要读取的配置就是demo.hello.prefix 和 demo.hello.suffix 的值

    @ConfigurationProperties注解的作用就是读取配置文件指定属性的值

  8. 编写一个自己的服务

    public class HelloService {HelloProperties helloProperties;public HelloProperties getHelloProperties() {return helloProperties;}public void setHelloProperties(HelloProperties helloProperties) {this.helloProperties = helloProperties;}public String sayHello(String name){return helloProperties.getPrefix() + name + helloProperties.getSuffix();}
    }
  9. 编写自动配置类并注入bean,测试

    @Configuration
    @ConditionalOnWebApplication //web应用生效
    @EnableConfigurationProperties(HelloProperties.class)
    public class HelloServiceAutoConfiguration {@AutowiredHelloProperties helloProperties;@Beanpublic HelloService helloService(){HelloService service = new HelloService();service.setHelloProperties(helloProperties);return service;}
    }

    说明:

    • @Configuration
      标识本类是配置类(相当于spring中application.xml)

    • @EnableConfigurationProperties(HelloProperties.class)
      如果 HelloProperties 中有注解@ConfigurationProperties 那么这个类就
      会被加到spring上下文的容器中,也就是可以通过@Autowire来注入

    • @ConditionalOnClass
      当类路径下有指定类的情况下 才进行下一步

    • @ConditionalOnMissingBean
      当spring容器中没有这个Bean的时候才进行下一步

  10. 在resources编写一个自己的 META-INF\spring.factories

```java
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.demo.config.HelloServiceAutoConfiguration```
  1. 编写完成后,可以安装到maven仓库中

  2. 项目包结构

3 . 新建项目测试自己写的启动器

  1. 新建一个SpringBoot 项目(需要引入 web 的启动器)

  2. 导入我们自己写的启动器

    <dependency><groupId>com.demo</groupId><artifactId>demo-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version>
    </dependency>
  3. 编写一个 HelloController 进行测试我们自己的写的接口

    @RestController
    public class HelloController {@AutowiredHelloService helloService;@RequestMapping("/hello")public String hello(){return helloService.sayHello("zxc");}}
  4. 编写配置文件 application.properties

    demo.hello.prefix="Mystarter-perfix--"
    demo.hello.suffix="--Mystarter-suffix"
  5. 启动项目进行测试,结果成功

相关文章:

SpringBoot:手写一个 SpringBoot Starter

声明&#xff1a;原文作者&#xff1a;yuan_404 文章目录1. 说明2 . 编写启动器3 . 新建项目测试自己写的启动器1. 说明 启动器模块是一个 空 jar 文件&#xff0c;仅提供辅助性依赖管理&#xff0c;这些依赖可能用于自动装配或者其他类库 命名归约&#xff1a; 官方命名&…...

【23】Verilog进阶 - 数位转换【实时处理 + 标志信号】

【初次尝试】VL32 非整数倍数据位宽转换24to128 1 理解题目含义 根据【模块端口】和【题目描述】本题的真实意思是比较清楚啦。但不可大意轻敌! (1)问题1:输出一直为0 猛然间发现计数值也为0,没有增加 去排查cnt的代码,很容易找到到问题,是cnt上电复位的逻辑写错了 …...

常见的HTTP状态码

一.2开头 200&#xff1a;响应成功&#xff1b; 204&#xff1a;响应成功&#xff0c;但是响应头没有数据&#xff1b; 206&#xff1a;部分响应成功&#xff0c;比如分片上传&#xff0c;断点续传&#xff1b; 二.3开头 301&#xff1a;永久重定向&#xff1b; 302&…...

D. Peculiar Movie Preferences(思维 + 一个坑)

Problem - D - Codeforces 米海打算去看电影。他只喜欢回文电影&#xff0c;所以他想跳过一些(可能是零)场景&#xff0c;让电影的其余部分变成回文。给你一个包含n个长度不超过3的非空字符串的列表&#xff0c;代表Mihai的电影场景。如果s的子序列非空&#xff0c;并且子序列中…...

真1分钟搞懂缓存穿透、缓存击穿、缓存雪崩

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…...

蓝桥刷题总结1

数组三角形 题目描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径&#xff0c;把路径上面的数加起来可以得到一个和&#xff0c;你的任务就是找到最大的和。 路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个…...

淘宝商品详情数据接口 关键字搜索接口 请求代码分享

item_get-获得淘宝商品详情item_get_app-获得淘宝app商品详情原数据item_search-按关键字搜索淘宝商品参数说明通用参数说明参数不要乱传&#xff0c;否则不管成功失败都会扣费url说明 https://api-gw.onebound.cn/平台/API类型/ 平台&#xff1a;淘宝&#xff0c;京东等&#…...

【数据结构】链表OJ(二)

Yan-英杰的博客 悟已往之不谏 知来者之可追 目录 一、反转链表 二、合并两个有序链表 三、链表分割 四、链表的回文结构 一、反转链表 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3&#xf…...

Linux系统搭建FTP服务器

安装vsftpdyum -y install vsftpd添加FTP用户方式1、添加只允许通过ftp访问的用户useradd -d /home/ftp ftp_user #-d指定用户登录时的启始目录方式2、允许用户登录操作系统usermod -d /home/ftp -s /bin/bash ftp_user #-s指定用户登入后所使用的shell设置用户登录密码passwd …...

MySQL数据同步到 Redis 缓存的几种方法

1 Mysql查完数据&#xff0c;再同步写入到Redis中缺点1&#xff1a;会对接口造成延迟&#xff0c;因为同步写入redis本身就有延迟&#xff0c;并且还要做重试&#xff0c;如果redis写入失败&#xff0c;还需要重试&#xff0c;那就更费时间了。缺点2&#xff1a;不解耦&#xf…...

2023年网络安全比赛--CMS网站渗透中职组(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.使用渗透机对服务器信息收集,并将服务器中网站服务端口号作为flag提交; 2.使用渗透机对服务器信息收集,将网站的名称作为flag提交; 3.使用渗透机对服务器渗透,将可渗透页面的名称作为flag提交; 4.使用渗透机对服务器渗透,…...

【蓝桥杯集训·每日一题】AcWing 4309. 消灭老鼠

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴最大公约数一、题目 1、原题链接 4309. 消灭老鼠 2、题目描述 约翰的农场可以看作一个二维平面。 农场中有 n 个老鼠&#xff0c;在毁坏着农田。 第 i 个老鼠的位置坐标为…...

FPGA实现CSI-2 解码MIPI视频 2line 720P分辨率 OV5647采集 提供工程源码和技术支持

目录1、前言2、Xilinx官方主推的MIPI解码方案3、纯Vhdl方案解码MIPI4、vivado工程介绍5、上板调试验证6、福利&#xff1a;工程代码的获取1、前言 FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了&#xff0c;MIPI解码难度之高&#xff0c;令无数英雄竞折腰…...

JS面试题收集(持续更新好中...)

1.JavaScript 中的垃圾回收机制 定义&#xff1a;指一块被分配的内存既不能使用&#xff0c;又不能回收&#xff0c;直到浏览器进程结束。 JavaScript在创建对象时会为它们分配内存&#xff0c;不再使用时会自动释放内存&#xff0c;这个过程称为垃圾收集。 四种常见的内存泄…...

2023携程面试题

Java I/O 面试前需要准备&#xff1a; 1. Java 八股文&#xff1a;了解常考的题型和回答思路&#xff1b; 2. 算法&#xff1a;刷 100-200 道题&#xff0c;记住刷题最重要的是要理解其思想&#xff0c;不要死记硬背&#xff0c;碰上原题很难&#xff0c;但 大多数的解题思…...

CANoe中使用CAPL函数接口调用Vflash文件

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…...

三天吃透计算机网络面试八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…...

shp数据添加wkt字段并导出成csv,leaflet绘制使用

准备的东西&#xff1a;软件2跟软件3具体怎么有这些软件需要自行百度postgresql postgis相关 1.shp数据 2.软件2 3.软件3 1.数据导入 首先你得有软件2的数据库&#xff0c;即postgresql数据库&#xff0c;然后通过postgis的插件进行连接并导入数据&#xff0c; 导入数据…...

Java——二叉树的最近公共祖先及二叉搜索树介绍

目录 二叉树的最近公共祖先 题目 思路一&#xff1a;如果给定的是一颗二叉搜索树&#xff0c; 思路二&#xff1a;假设是孩子双亲表示法 二叉搜索树 定义Node类 查找 删除 插入 二叉树的最近公共祖先 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百…...

Stable Diffusion加chilloutmixni真人图片生成模型,AI绘图杀疯了

上期图文教程,我们分享过AI绘图大模型Stable Diffusion以及中文版本文心AI绘画大模型的基础知识以及代码实现,截至到目前为止。Stable Diffusion模型已经更新到了V2.1版本,其文生图大模型也越来越火,其在2022年底,由AI绘制的图片被荣为国际大奖,让大家对AI绘画大模型也越…...

不止于dhclient:深入理解Ubuntu网络初始化与127.0.0.1困局的系统级排查

不止于dhclient&#xff1a;深入理解Ubuntu网络初始化与127.0.0.1困局的系统级排查 当你在Ubuntu服务器上输入ifconfig&#xff0c;却发现除了lo接口外其他网卡全部"消失"&#xff0c;IP地址被锁定在127.0.0.1时&#xff0c;那种感觉就像被困在数字世界的孤岛。本文将…...

从吞吐量到响应时间:Shenyu网关监控指标全方位解析

从吞吐量到响应时间&#xff1a;Shenyu网关监控指标全方位解析 你是否曾因API网关性能瓶颈导致服务雪崩&#xff1f;是否在排查线上问题时缺乏关键指标数据&#xff1f;本文将系统讲解Shenyu网关的核心监控指标体系&#xff0c;从基础配置到高级分析&#xff0c;帮你构建完整的…...

OpenClaw语音交互方案:GLM-4.7-Flash对接ASR/TTS

OpenClaw语音交互方案&#xff1a;GLM-4.7-Flash对接ASR/TTS 1. 为什么需要语音交互的OpenClaw&#xff1f; 上周三凌晨两点&#xff0c;我正在赶一份项目报告时突然冒出一个想法&#xff1a;如果能用语音控制OpenClaw执行自动化任务&#xff0c;是不是能彻底解放双手&#x…...

Turtlebot3仿真避坑指南:从ROS环境配置到GPU加速训练的全流程解析

Turtlebot3仿真避障训练全流程避坑指南&#xff1a;从环境配置到GPU加速的实战经验 第一次在实验室里启动Turtlebot3仿真环境时&#xff0c;我盯着屏幕上卡在99%加载进度的Gazebo界面整整三小时。作为机器人方向的研究生&#xff0c;没人告诉我仿真环境搭建会消耗80%的科研时间…...

从马达驱动到手机快充:聊聊电荷泵(Charge Pump)这个‘老古董’技术是怎么翻红的

从马达驱动到手机快充&#xff1a;电荷泵技术的跨时代复兴 在电子工程领域&#xff0c;很少有技术能像电荷泵这样经历如此戏剧性的复兴。这个诞生于上世纪70年代的电路设计&#xff0c;最初只是工程师工具箱里一个不起眼的模块&#xff0c;如今却成为智能手机快充、OLED显示驱动…...

基于LiveQing流媒体平台实现大疆无人机等RTMP推流接入轻松实现Web网页直播+录像回放

大疆无人机RTMP推流接入LiveQing&#xff0c;轻松实现Web网页直播录像留存 在无人机直播场景中&#xff0c;大疆无人机凭借出色的空中视角和稳定的图传表现&#xff0c;成为应急救援、工程巡检、赛事直播、国土测绘等领域的首选设备。但很多用户在使用大疆无人机直播时&#xf…...

个人健康助手:OpenClaw+nanobot分析智能手环数据

个人健康助手&#xff1a;OpenClawnanobot分析智能手环数据 1. 为什么需要自动化健康数据分析 作为一个长期伏案工作的程序员&#xff0c;我的抽屉里躺着三款不同品牌的智能手环。它们记录了我每天的步数、心率、睡眠周期等数据&#xff0c;但每次打开厂商APP查看那些五彩斑斓…...

嵌入式开发调试技巧与宏应用详解

嵌入式软件开发调试技巧全解析 1. 调试基础宏的使用 1.1 编译器内置调试宏 在嵌入式开发中&#xff0c;GCC编译器提供了一系列内置宏用于调试&#xff0c;这些宏会在编译时自动展开&#xff1a; __FILE__ // 当前源文件名 (char*) __FUNCTION__ // 当前函数名 (char*) _…...

Cherry Studio容器化部署实战指南:从环境搭建到生产运维

Cherry Studio容器化部署实战指南&#xff1a;从环境搭建到生产运维 【免费下载链接】cherry-studio &#x1f352; Cherry Studio is a desktop client that supports for multiple LLM providers. Support deepseek-r1 项目地址: https://gitcode.com/GitHub_Trending/ch/c…...

嵌入式硬件工程师如何转型管理者

嵌入式硬件工程师的职业发展路径&#xff1a;从技术专家到管理者的转型指南1. 职业发展概述1.1 技术与管理双轨发展在嵌入式硬件工程领域&#xff0c;职业发展通常呈现两条路径&#xff1a;技术专家路线和管理路线。对于希望转向管理岗位的工程师&#xff0c;需要理解技术能力与…...