【五一创作】spring boot starter 编写自己的starter

news2024/12/29 10:50:57

spring boot starter 编写自己的starter

陈钊

2023-5-1

源码地址: https://gitcode.net/qq_39339588/my-spring-boot-starter.git

封装my-spring-boot-starter

  1. 新建springboot工程,来封装为自己的spring-boot-starter

在这里插入图片描述

  1. 包名,随便写,这里没有什么限制

    版本号设置为0.0.1,方便后期依赖使用

在这里插入图片描述

  1. 依赖,选择基础的几个就行

在这里插入图片描述

  1. 项目是用来创建封装自己的starter,不需要打包插件,删除pom.xml中无用的内容

在这里插入图片描述

  1. 注意看lombok依赖,去掉optional

       <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <!--  这个去掉,不然会不向下传递-->
                <!-- <optional>true</optional>-->
            </dependency>
    
  2. 项目是用来创建封装自己的starter,删除启动类和测试相关的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TxkUYcSM-1682945752378)(images/image-20230501173330189.png)]

  1. 只剩下了空架子,如图

在这里插入图片描述

  1. 创建 自定义自动配置类,一会儿在spring.factories文件中会设置引导
package space.xx.xxx.myspringbootstarter.config;

import org.springframework.context.annotation.Configuration;

/**
* 我的-自定义的自动装配类;会由spring.factories文件引导
*
* @author chenzhao
* @create 2023-05-01 17:35
*/
@Configuration
public class MyEnableAutoConfiguration {
   //TODO 一会儿添加内容
}

  1. 创建spring.factories引导文件
    resources文件夹下,新创建META-INF文件夹,在其中新建spring.factories文件
    配置指向"MyEnableAutoConfiguration"类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=space.xx.xxx.myspringbootstarter.config.MyEnableAutoConfiguration

  1. 创建配置文件的类MyProperties, 别的工程依赖后,会读取别的工程中my开头的配置文件
package space.xx.xxx.myspringbootstarter.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
* 配置文件类,装配数据
* @author chenzhao
* @create 2023-05-01 17:45
*/
@Data
@ConfigurationProperties(prefix = "my")
public class MyProperties {
   private String name;
   private Integer age;
}
  1. 创建service层,使用配置类的配置参数
package space.xx.xxx.myspringbootstarter.service;

import lombok.AllArgsConstructor;

/**
* 封装service,方便其他注入使用
* @author chenzhao
* @create 2023-05-01 14:40
*/
@AllArgsConstructor
public class MyService {
   private String name;
   public String sayName(){
       return this.name;
   }
}
  1. 编辑完善MyEnableAutoConfiguration,引入MyProperties.class,注入MyService
package space.xx.xxx.myspringbootstarter.config;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import space.xx.xxx.myspringbootstarter.service.MyService;

/**
* 我的-自定义的自动装配类;会由spring.factories文件引导
*
* @author chenzhao
* @create 2023-05-01 17:35
*/
@Configuration
@EnableConfigurationProperties(MyProperties.class)
@ConditionalOnProperty("my.name")
public class MyEnableAutoConfiguration {
   /**
    * 装配 MyService
    * @param myProperties
    * @return
    */
   @Bean
   public MyService my2Service(MyProperties myProperties){
       return new MyService(myProperties.getName());
   }
}

  1. 部署到本地maven仓库install一下,会把创建的my-starter打包到maven仓库,其他工程就可以找到这个了。

在这里插入图片描述

新建其他spring-boot项目,依赖验证

  1. 新建springboot工程,默认不依赖任何包
  2. 依赖my-spring-boot-starter包
<dependencies>
   <dependency>
       <groupId>space.xx.xxx</groupId>
       <artifactId>my-spring-boot-starter</artifactId>
       <version>0.0.1</version>
   </dependency>
</dependencies>
  1. 配置文件中application.properties,设置name
my.name=goldchen
  1. 编写测试接口

    package space.goldchen.my.mytest.rest;
    
    import lombok.RequiredArgsConstructor;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import space.xx.xxx.myspringbootstarter.service.MyService;
    
    /**
     * @author chenzhao
     * @create 2023-05-01 12:05
     */
    @RestController
    @RequiredArgsConstructor
    public class HiRest {
        private final MyService myService;
    
        @GetMapping("hi")
        public String say(){
            return  myService.sayName();
        }
    }
    
    
  2. 调用接口,MyService可以直接注入使用了,并且配置中的name也读取过来了
    在这里插入图片描述

  3. 大功告成

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

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

相关文章

基于电流控制的并网逆变器(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

操作系统:文件系统

文件系统 文件保护 文件的保护通过口令保护、加密保护、和访问控制等方式实现。其中&#xff0c;口令和加密是为了防止用户文件被他人存取或窃取&#xff0c;而访问控制则用于控制用户对文件的访问方式。 口令保护 口令指用户在建立一个文件时提供一个口令&#xff0c;系统…

算法套路十四——动态规划之背包问题:01背包、完全背包及各种变形

算法套路十四——动态规划之背包问题&#xff1a;01背包、完全背包及各种变形 算法示例一——0/1背包&#xff1a; 0-1背包:有n个物品&#xff0c;第i个物品的体积为w[i]&#xff0c;价值为v[i]&#xff0c;每个物品至多选一个&#xff0c; 求体积和不超过capacity时的最大价值…

【状态机dp之 股票买卖 题型系列 帮你学懂 状态机】股票买卖(1-6道题)

股票买卖 股票买卖 1这道题就是求max {ai−aj|j<i} 股票买卖 2股票买卖 3方法一&#xff1a;前后缀拆分dp怎么想到的&#xff1f;方法二&#xff1a;状态机dpf[0/1][i]表示只考虑前i支股票且手头有/没有股票的最大收益 股票买卖 4考虑前 i 天的股票&#xff0c;第 i 天的 决…

深入浅出C++ ——C++11

文章目录 一、C11简介二、列表初始化二、声明四、范围for循环五、STL中的变化六、右值引用和移动语义1. 什么是左值&#xff1f;什么是左值引用&#xff1f;2. 左值引用与右值引用比较3. 右值引用使用场景和意义4. 完美转发 新的类功能默认成员函数类成员变量初始化defaultdele…

在Unity中制作完整的技能系统(介绍篇)

1. 系统结构介绍 首先我们需要对技能中的部分进行一个划分。通过观察&#xff0c;我们不难发现&#xff0c;在多个技能中经常有一些相同的内容&#xff08;以下的例子均来自于《英雄联盟》&#xff09;&#xff1a; 火男被动的燃烧一定时间持续伤害和提莫的E技能中毒一定时间…

【@Param注解】| 台面使用——>底层原理分析

🐇 🐇 😄 🐇 🐇 🐇 🐇 😄 🐇 🐇 🐇 🐇 😄 🐇 🐇 🐇 🐇 😄 🐇 🐇 🐇 🐇 😄 目录 🦁 定义🦁 台面使用🦁 底层原理分析🦁 尾声🐇 🐇 😄 🐇 🐇 🐇 🐇 😄 🐇 🐇 🐇 🐇 😄 🐇 🐇 🐇 🐇 😄…

【Python】什么是爬虫,爬虫实例

有s表示加密的访问方式 一、初识爬虫 什么是爬虫 网络爬虫&#xff0c;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性&#xff0c;根据用户需求定向抓取相关网页并分析已成为如今主流的爬取策略爬虫可以做什么 你可以…

【JAVAEE】JAVA数据库连接(JDBC)

1.什么是JDBC&#xff1f; Java数据库连接&#xff0c;&#xff08;Java Database Connectivity&#xff0c;简称JDBC&#xff09;是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口&#xff0c;提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsyste…

[优雅的面试]MySQL与Redis双写一致性方案

前言 由于缓存的高并发和高性能已经在各种项目中被广泛使用&#xff0c;在读取缓存这方面基本都是一致的&#xff0c;大概都是按照下图的流程进行操作&#xff1a; 但是在更新缓存方面&#xff0c;是更新完数据库再更新缓存还是直接删除缓存呢&#xff1f;又或者是先删除缓存再…

TypeError: Object of type ‘Decimal‘ is not JSON serializable

错误 TypeError: Object of type ‘Decimal’ is not JSON serializable 场景 该错误是在Python3中使用Flask的报错&#xff0c;之前代码是运行正常的&#xff0c;时过几年后再次安装部署&#xff0c;确出现问题。 分析 经过分析发现依旧是版本依赖导致的更新问题。最近在…

JS手写实现Promise.race

Promise.race() 是一个常见的 JavaScript Promise 方法&#xff0c;它接受一个 Promise 数组作为参数&#xff0c;并返回一个新的 Promise 对象。这个新的 Promise 对象在传入的 Promise 数组中&#xff0c;任意一个 Promise 对象状态变为 fulfilled 或者 rejected&#xff0c;…

57.网页设计图标实战

首先我们需要找一个图标库&#xff0c;本次演示采用的是heroicon ● 之后我们根据需求搜索与之想匹配的图标并复制svg代码 ● 之后将我们的代码复制到我们想要放置图标的地方 ● 当然我们需要使用CSS来修饰一下 .features-icon {stroke: #087f5b;width: 32px;height: 3…

Python——Pyqt5的数据可视化小工具(完整代码)

前言 作业要求&#xff1a;【都已经打包放网上了&#xff0c;有缘人需要就自取】 一份报告书&#xff08;在全球变暖背景下碳中和对各国的二氧化碳排放量的影响项目报告书&#xff09; 一份代码 作业包&#xff1a;python数据可视化小工具.zip - 蓝奏云 大一的时候&#xff0c;…

Java 整合常用docker Api

整合环境&#xff1a; 与docker 版本差异不大&#xff0c;基本都可以 API version: 1.26开放docker api &#xff0c;两种方式 /etc/sysconfig/docker &#xff0c;最后一行添加&#xff1b;开放端口&#xff1a;2375 -H tcp://0.0.0.0:2375systemctl status docker 查询 d…

vsftpd.conf参数配置

文章目录 初始vsftdp.conf翻译后需修改参数write_enableYES&#xff08;启用任何形式的FTP写入命令&#xff09;userlist_file/etc/vsftpd.user_list、userlist_enableYES、userlist_denyNOlocal_umask022&#xff08;放开权限&#xff09;chroot_local_userYES&#xff08;限定…

每日学术速递4.29

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.LG 1.A Cookbook of Self-Supervised Learning 标题&#xff1a;自监督学习食谱 作者&#xff1a;Randall Balestriero, Mark Ibrahim, Vlad Sobal, Ari Morcos, Shashank Shekhar, Tom…

学知识变现,看完这些就够了

点击查看【18本知识变现电子书】 100个实用知识点 60万字知识变现精华 资深知识变现教练海哥扛鼎之作 2000多位学员实战经验干货总结 从理论到实践&#xff0c;从思维到实操 教你彻底学透如何知识变财富 .......... 全网最全知识变现知识付费电子教程 资深知识变现教练海…

Linux线程相关函数:线程的创建、属性、回收、退出、取消

1. 线程号 进程号在系统中唯一&#xff0c;但线程号只在其所属进程环境中有效。 &#xff08;1&#xff09;pthread_self函数 #include<pthread.h>pthread_t pthread_self(void); /* 功能&#xff1a;获取线程号 返回值&#xff1a;调用此函数线程的ID */ pthread_se…

【Unity-UGUI控件全面解析】| Panel 容器组件详解

🎬【Unity-UGUI控件全面解析】| Panel 容器组件详解一、组件介绍二、组件属性面板三、代码操作组件💯总结🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游…