手写SpringBoot的starter

news2025/7/20 14:47:12

自定义SpringBoot的starter

引言

starter命名格式:

  • 官方的 starter 的命名格式为 spring-boot-starter-{xxxx} 比如spring-boot-starter-activemq
    第三方我们自己的命名格式为 {xxxx}-spring-boot-starter。比如mybatis-spring-boot-starter。
    如果我们忽略这种约定,是不是会显得我们写的东西不够“专业“。

实战

完整项目结构:
在这里插入图片描述

①导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
    <scope>provided</scope>
</dependency>

②编写配置文件类(SmsProperties)

@ConfigurationProperties(prefix = "sms")
@Data
public class SmsProperties {

    private SmsMessage aliyun = new SmsMessage();

    private SmsMessage tencent = new SmsMessage();

    @Data
    public static class SmsMessage{


        /**
         * username 用户名
         */
        private String userName;

        /**
         * 密码
         */
        private String passWord;

        /**
         * 秘钥
         */
        private String sign;

        /**
         *
         */
        private String url;

        @Override
        public String toString() {
            return "SmsMessage{" +
                    "userName='" + userName + '\'' +
                    ", passWord='" + passWord + '\'' +
                    ", sign='" + sign + '\'' +
                    ", url='" + url + '\'' +
                    '}';
        }
    }
}

@ConfigurationProperties注解上配置的prefix 属性,主要用来区别各个组件的参数。

  • 这里有个小知识点需要注意下当我们在配置文件输入sms我们的idea会提示这个sms有哪些属性可以配置,以及每个属性的注释都有标记,建议的话注释还是写英文,这样会显得你比较专业。
    如果想要把此处字段上的注释展示出来,则需要导入
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-configuration-processor</artifactId>
   <optional>true</optional>
</dependency>

效果:
在这里插入图片描述

③编写自动配置类

@EnableConfigurationProperties(value = SmsProperties.class)
@Configuration
public class SmsAutoConfiguration  {
    /**
     *  阿里云发送短信的实现类
     * @param smsProperties
     * @return
     */
    @Bean
    public AliyunSmsSenderImpl aliYunSmsSender(SmsProperties smsProperties){
        return new AliyunSmsSenderImpl(smsProperties.getAliyun());
    }
    /**
     * 腾讯云发送短信的实现类
     * @param smsProperties
     * @return
     */
    @Bean
    public TencentSmsSenderImpl tencentSmsSender(SmsProperties smsProperties){
        return new TencentSmsSenderImpl(smsProperties.getTencent());
    }
}

④接口及实现类

接口:

public interface SmsSenderService {

    boolean send(String msg);
}

实现类:

public class TencentSmsSenderImpl implements SmsSenderService{

    private SmsProperties.SmsMessage smsMessage;

    public TencentSmsSenderImpl(SmsProperties.SmsMessage smsProperties) {
        this.smsMessage = smsProperties;
    }

    @Override
    public boolean send(String message) {
        System.out.println(smsMessage.toString()+"开始发送短信==》短信内容:"+message);
        return true;
    }
}
public class AliyunSmsSenderImpl implements SmsSenderService {

    private SmsProperties.SmsMessage smsMessage;

    public AliyunSmsSenderImpl(SmsProperties.SmsMessage smsProperties) {
        this.smsMessage = smsProperties;
    }

    @Override
    public boolean send(String message) {
        System.out.println(smsMessage.toString()+"开始发送短信==》短信内容:"+message);
        return true;
    }
}

⑤让starter生效(应用集成)

starter集成应用有两种方式:

  1. 被动生效

通过SpringBoot的SPI机制

  • resources目录下新建一个META-INF目录
  • 在META-INF目录下创建spring.factories
  • spring.factories写入:

在这里插入图片描述

注意两行都是顶格写

  1. 主动生效(注解)

在starter组件集成到我们的Spring Boot应用时需要主动声明启用该starter才生效

  • 通过自定义一个@Enable注解然后在把自动配置类通过Import注解引入进来。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({SmsAutoConfiguration.class})
public @interface EnableSms {
}

使用的时候需要在启动类上面开启这个注解。
在这里插入图片描述

⑥mvn install打包到本地仓库

记得需要打包到本地仓库(别忘记将settings中的maven配置修改为本地的maven)

BUG:如果我们引入了自定义的starter之后,仍然找不到,则需要在自定义starter项目中添加插件(因为多了BOOT-INF)

<!--找不到自定义starter-->
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

⑦使用

  1. 新建项目,引入我们的starter依赖
<!--自定义starter-->
<dependency>
    <groupId>com.zi</groupId>
    <artifactId>sms-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>
  1. 编写配置文件
server:
  port: 8080
# 自定义starter中的配置
sms:
  aliyun:
    user-name: ziyi
    pass-word: 123456
    url: https://aliyun.com/send
  1. 测试类中的启动类
@SpringBootApplication
//@EnableSms
public class StarterDemoApplication {

    @Autowired

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(StarterDemoApplication.class, args);
        AliyunSmsSenderImpl aliyunSmsSender = applicationContext.getBean(AliyunSmsSenderImpl.class);
        aliyunSmsSender.send("用阿里云发送短信");
    }

}
  1. 启动Application,查看结果
    在这里插入图片描述

参考:
https://developer.aliyun.com/article/893073

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

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

相关文章

【Git】与“三年经验”就差个分支操作的距离

前言 Java之父于胜军说过&#xff0c;曾经一位“三年开发经验”的程序员粉丝朋友&#xff0c;刚入职因为不会解决分支问题而被开除&#xff0c;这是不是在警示我们什么呢&#xff1f; 针对一些Git的不常用操作&#xff0c;我们通过例子来演示一遍 1.版本回退 1.1已提交但未p…

【Nginx】|入门连续剧——安装

作者&#xff1a;狮子也疯狂 专栏&#xff1a;《Nginx从入门到超神》 坚持做好每一步&#xff0c;幸运之神自然会降临在你的身上 目录一. &#x1f981; 前言Ⅰ. &#x1f407; 为啥我们要使用Nginx&#xff1f;二. &#x1f981; 搭建流程Ⅰ. &#x1f407; 环境准备Ⅱ. &…

LeetCode 热题 C++ 141. 环形链表 142. 环形链表 II(详解!)

力扣141 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&am…

图片和ppm文件互转

一、代码结构 二、代码实现 Denoise.java&#xff1a; package com.xj.ppm.toimg;import java.awt.FlowLayout; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel;/*** Image noise reduction pro…

I.MX6ULL内核开发10:设备树

目录 一、设备树简介 二、设备树源码 三、获取设备树信息 1、增加设备节点 2、内核编译设备树 3、替换设备树文件 4、查看设备树节点 5、在驱动中获取节点的属性 6、编译驱动模块 7、加载模块 一、设备树简介 设备树的作用是描述一个硬件平台的硬件资源。这个“设备树…

Redis主从和哨兵搭建

今天主要分享Redis主从架构和哨兵的搭建。 主从集群搭建 总共三个节点&#xff0c;一个主节点和两个从节点。都安装在一台机器上模拟主从集群&#xff0c;信息如下&#xff1a; IPPORT角色192.168.246.1407001slave192.168.246.1407002master192.168.246.1407003slave 我们只…

FreeRTOS入门(04):中断、内存、追踪与调试

文章目录目的中断内存堆&#xff08;heap&#xff09;栈&#xff08;stack&#xff09;断言调试总结目的 有了前面的几篇文章 FreeRTOS 基本上已经可以在项目中使用上了&#xff1a; 《FreeRTOS入门&#xff08;01&#xff09;&#xff1a;基础说明与使用演示》 《FreeRTOS入门…

【java 8】强大的 Stream API

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

因子分析计算权重

因子分析两类权重计算方法总结 案例背景 疫情爆发以来&#xff0c;越来越多的人为了避免线下与人接触&#xff0c;选择了线上购买生活必需品。网购虽然方便快捷&#xff0c;但是随着订单压力的增加&#xff0c;物流问题也随之出现&#xff0c;近期有很多卖家收到物流投诉的问题…

Ubuntu下Python的安装及管理

Ubuntu下Python的安装及管理 1.概述 Ubuntu下python的安装及配置。 2.安装 安装python2.7&#xff1a; python --version #或python2.7 --version检查检查python是否存在&#xff0c;有则无需继续安装python2.7 sudo apt-get update sudo apt-get install python #或者su…

【正点原子FPGA连载】第十五章eMMC读写测试实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十五章eMMC读写…

BI工具术语表大全:从字母A-Z全面收录

谈到商业智能行业&#xff0c;变革是不可避免的。为了跟上步伐&#xff0c;各种各样的BI 解决方案正在快速迭代更新&#xff0c;以满足企业的数字化需求&#xff0c;那么市场上BI 工具种类繁杂&#xff0c;到底如何选择适合功能全面、满足自己企业运转情况的、合适的BI 工具呢&…

来啦来啦,续篇来啦,CMOS逻辑IC基本工作原理总结概述

在上一篇文章中我们已经认识了CMOS逻辑IC的基本知识和分类&#xff0c;由于功耗和成本以及复杂度的平衡性最好&#xff0c;是实际应用中最常用的一种。今天我们就详细跟大家一起了解东芝CMOS逻辑IC的基本工作原理还有其CMOS逻辑IC系列型号选型吧。 东芝CMOS逻辑IC系列型号选型表…

什么是主数据

整理不易&#xff0c;转发请注明出处&#xff0c;请勿直接剽窃&#xff01; 点赞、关注、不迷路&#xff01; 摘要&#xff1a;主数据定义、解释&#xff1b;主数据管理意义、管理工具 定义&#xff1a;主数据是企业内核心业务实体数据。 解释&#xff1a;主数据&#xff08;Ma…

gRPC Ecosystem 初探

grpc是目前使用很广泛的远程过程调用库&#xff0c;在使用过程中&#xff0c;我们通常会使用protoc命令将proto文件转成特定的代码进行使用。那一些复杂点的应用有没有可以支撑的工具或类库呢。 前段时间在进行自定义grpc tls证书认证的过程中&#xff0c;知道了有一个github项…

【重庆邮电大学协办】2023年第六届数据挖掘与知识发现国际会议(DMKD 2023)

【重庆邮电大学协办】2023年第六届数据挖掘与知识发现国际会议(DMKD 2023) 重要信息 会议网址&#xff1a;www.icdmkd.org 会议时间&#xff1a;2023年6月24-26日 召开地点&#xff1a;中国-重庆 截稿时间&#xff1a;2023年5月24日 录用通知&#xff1a;投稿后2周内 收录…

测试部门来了个99年的卷王之王,老油条感叹真干不过,但是...

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…

实战-缓存数据一致+binlog初始+cannel监听+数据迁移,数据一致性架构设计

前言 一. 解决缓存不命中&#xff08;高并发操作击穿打挂DB的风险&#xff09; 当并发量打的时候&#xff0c;当我们的缓存过期时&#xff0c;就算到数据库的比例偏小的时候&#xff0c;我们的请求时比较大的。那也会存在数据库崩掉的情况。解决方案想法如下&#xff08;总体…

电商共享购模式,消费增值返利,app开发

在当今以市场需求为主导的数字经济时代&#xff0c;消费者需求呈现出精细化管理和多元化的特性&#xff0c;目标市场日渐完善&#xff0c;另外在大数据技术迅速进步和运用的驱动下&#xff0c;总体行业的发展节奏感也在不断加速。因而&#xff0c;企业需要建立一套灵活多变的经…

【Leedcode】数据结构中链表必备的面试题(第五期)

【Leedcode】数据结构中链表必备的面试题&#xff08;第五期&#xff09; 文章目录【Leedcode】数据结构中链表必备的面试题&#xff08;第五期&#xff09;1.题目2.思路图解&#xff08;1&#xff09;第一步&#xff1a;复制每一个结点&#xff0c;插入到原结点和下一个结点之…