Spring Boot之自定义starter

🥳🥳Welcome Huihui's Code World ! !🥳🥳

接下来看看由辉辉所写的关于Spring Boot的相关操作吧 

目录

🥳🥳Welcome Huihui's Code World ! !🥳🥳

一. starter是什么

二.为什么要使用starter

三.怎么自定义starter【附自定义starter的案例制作】

1.创建Starter项目(spring-initializr)

2.定义Starter需要的配置类(Properties)

3.编写Starter项目的业务功能

4.编写自动配置类

5.编写spring.factories文件加载自动配置类

6.打包安装

7.其它项目引用

四.自定义starter运用到的注解


一. starter是什么

  SpringBoot中的starter是一种非常重要的机制(自动化配置),能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰

所有这些依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循“约定大于配置”的理念

二.为什么要使用starter

         使用starter的主要目的是简化应用程序的开发和配置过程。通常,一个应用程序需要包含许多组件和配置,如数据库连接、安全认证、日志记录等。使用starter可以将这些组件和配置预先打包为一个可重用的模块,使得开发者能够更快速地启动一个基本的应用程序   

         在我们的日常开发工作中,经常会有一些独立于业务之外的配置模块,我们经常将其放到一个特定的包下,然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍,麻烦至极。如果我们将这些可独立于业务代码之外的功能配置模块封装成一个个starter,复用的时候只需要将其在pom中引用依赖即可, SpringBoot为我们完成自动装配,简直不要太爽。

三.怎么自定义starter【附自定义starter的案例制作】

1.创建Starter项目(spring-initializr)

​​​​​​​

2.定义Starter需要的配置类(Properties)

package com.wh.mysmsspringbootstarter.properties;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 短信服务配置类
 */

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

//    @Value("${mysms.keys}")
    private String keys;//访问ID、即帐号
//    @Value("${mysms.secret}")
    private String secret;//访问凭证,即密码
    
}

3.编写Starter项目的业务功能

package com.wh.mysmsspringbootstarter.service;

public interface ISmsService {

    /**
     * 发送短信
     *
     * @param phone        要发送的手机号
     * @param data         要发送的内容
     */
    void send(String phone, String data);

}
package com.wh.mysmsspringbootstarter.service;


import com.wh.mysmsspringbootstarter.properties.SmsProperties;
import org.springframework.stereotype.Service;

public class SmsServiceImpl implements ISmsService {

    private SmsProperties smsProperties; //null

    public SmsServiceImpl(SmsProperties smsProperties) {
        this.smsProperties=smsProperties;
    }

    @Override
    public void send(String phone, String data) {
        String key = smsProperties.getKeys();
        String secret = smsProperties.getSecret();
        //System.out.println("接入短信系统,Keys=" + key + ",Secret=" + secret);
        System.out.println("短信发送,phone=" + phone + "data=" + data);
    }

}

4.编写自动配置类

在此去控制service是否会被加到spring中,所以就不能够使用spring的自动装配了,而是要手动去装配,在这里是先拿到配置类,然后在下面写一个方法去控制service导入spring

并且配置类也不能够交给spring自动装配了

然后需要去将配置类注入到spring,这样子的话,只要配置类和service就是一个捆绑的关系了(配置类注入spring时,service也会注入到spring中)

使用属性去控制是否使用功能(是否注入配置类以及service到spring中)

5.编写spring.factories文件加载自动配置类

注意:其中AutoConfig是starter配置文件的类限定名,多个之间逗号分割,还可以\进行转义即相当于去掉后面换行和空格符号

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.wh.mysmsspringbootstarter.config.SmsConfig

6.打包安装

我们也可以检查一下是否安装完毕

7.其它项目引用

①引入pom依赖

 <!--自定义stater-->
        <dependency>
            <groupId>com.wh</groupId>
            <artifactId>mysms-spring-boot-starter</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

②yml配置

🔺如果在其他项目中引用的时候,出现了下面的这种情况(框住的是当时报红的,也意味着用不了这个启动类),那么就在启动类的pom中引入一个插件

<!--自定义starter-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>

测试类

package com.wh.springboot;


import com.wh.mysmsspringbootstarter.properties.SmsProperties;
import com.wh.mysmsspringbootstarter.service.SmsServiceImpl;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest(classes = SpringbootApplication.class)
class SpringbootApplicationTests {

    @Autowired
    private SmsProperties smsProperties;


    @Test
    void contextLoads() {
        new SmsServiceImpl(smsProperties).send("17377865455","么么哒");
    }

}

四.自定义starter运用到的注解

  1. @SpringBootApplication这是一个组合注解,包括了 @Configuration@EnableAutoConfiguration@ComponentScan。这个注解通常在引导类(如 Application)上使用。

  2. @EnableAutoConfiguration启用自动配置机制。这个注解可以让 Spring Boot 根据项目的依赖和配置来自动配置应用程序。

  3. @ConfigurationProperties将属性绑定到特定的 Java 类中。这个注解通常用于将应用程序的自定义配置绑定到一个 POJO 中。

  4. @ConditionalOnClass当给定的类在类路径上存在时,才实例化一个 Bean。这个注解可用于根据特定的条件来控制 Bean 的创建。

  5. @ConditionalOnMissingBean当给定的 Bean 不存在时,才实例化一个 Bean。这个注解可用于根据特定的条件来控制 Bean 的创建。

  6. @ConditionalOnProperty当指定的属性存在并且具有指定的值时,才实例化一个 Bean。这个注解可用于根据特定的属性值来控制 Bean 的创建。

  7. @Autowired自动装配一个 Bean,并将它注入到另一个 Bean 中。

  8. @Component将一个普通的 Java 类声明为 Spring Bean。

  9. @RestController将一个 Java 类声明为 Web 控制器,用于处理 HTTP 请求。

  10. @RequestMapping将一个方法映射到一个特定的 URL,并指定请求方法(如 GET、POST 等

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

万界星空科技AI低代码云MES系统

在企业生产管理过程中&#xff0c;从市场、生产现场到产品交付&#xff0c;生产制造行业都面临着诸多挑战&#xff0c;比如&#xff1a; 订单排产难度大&#xff1a;订单混乱&#xff0c;常漏排产、错排产&#xff1b;产能不明晰&#xff0c;无法承诺交期&#xff0c;常丢单&a…

智慧工地源码(微服务+Java+Springcloud+Vue+MySQL)

智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台&#xff0c;是一种全新的管理模式&#xff0c;能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三…

python selenium chrome114版本之后环境配置和携带缓存打开chrome

尽力局 chrome驱动环境配置chrome打开带缓存设置待缓存打开自动关闭浏览器自动关闭浏览器弹窗 最终代码找资料难啊最终效果代码 依赖包和生成依赖包方法关闭谷歌升级 chrome驱动环境配置 网上找到的资料&#xff0c;我现在安装的是120版本的&#xff0c;这个资料是可行的。比较…

物流实时数仓:数仓搭建(DWD)一

系列文章目录 物流实时数仓&#xff1a;采集通道搭建 物流实时数仓&#xff1a;数仓搭建 物流实时数仓&#xff1a;数仓搭建&#xff08;DIM&#xff09; 物流实时数仓&#xff1a;数仓搭建&#xff08;DWD&#xff09;一 文章目录 系列文章目录前言一、文件编写1.目录创建2.b…

亚信科技AntDB数据库——深入了解AntDB-M元数据锁的实现(一)

锁的获取 5.1 锁的强弱 当线程已经持有的锁比新申请的锁更强时&#xff0c;认为已经持有了锁&#xff0c;无需再对申请锁类型加锁。锁的强弱指持有的锁与其他锁的不兼容集合大小&#xff0c;集合相同锁相同&#xff0c;集合更大锁更强&#xff0c;否则无强弱关系。通过锁的兼…

Kafka-Kafka基本原理与集群快速搭建

一、Kafka介绍 ​ ChatGPT对于Apache Kafka的介绍&#xff1a; Apache Kafka是一个分布式流处理平台&#xff0c;最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。 Kafka是一个分布式的发布-订阅消息系统&#xff0c;可以快速地处理…

JAVA:深入探讨Map的多种遍历方式

1、简述 在现代编程中&#xff0c;Map&#xff08;映射&#xff09;是一种常见的数据结构&#xff0c;用于存储键-值对。在许多编程语言中&#xff0c;Map提供了灵活的数据组织方式&#xff0c;但为了充分发挥其功能&#xff0c;我们需要了解多种遍历方式。本文将深入探讨Map的…

龙迅LT2611UXC 双PORT LVDS转HDMI(2.0)+音频

描述&#xff1a; LT2611UXC是一个高性能的LVDS到HDMI2.0的转换器&#xff0c;用于STB&#xff0c;DVD应用程序。 LVDS输入可配置为单端口或双端口&#xff0c;有1个高速时钟通道&#xff0c;3~4个高速数据通道&#xff0c;最大运行1.2Gbps/通道&#xff0c;可支持高达9.6Gbp…

牛客网SQL训练2—SQL基础进阶

文章目录 一、基本查询二、数据过滤三&#xff1a;函数四&#xff1a;分组聚合五&#xff1a;子查询六&#xff1a;多表连接七&#xff1a;组合查询八&#xff1a;技能专项-case when使用九&#xff1a;多表连接-窗口函数十&#xff1a;技能专项-having子句十一&#xff1a;技能…

桂电|《操作系统》实验一:UNIX/LINUX及其使用环境(实验报告)

桂林电子科技大学2023-2024学年 第 一 学期 操作系统A 实验报告 实验名称 实验一 UNIX/LINUX及其使用环境 实验指导老师&#xff1a; 成绩 院 系 计算机与信息安全学院 专业 计算机科学与技术(卓越工程) 学 号 姓名 课内序…

保姆级 Keras 实现 YOLO v3 三

保姆级 Keras 实现 YOLO v3 三 一. 分配 anchor box二. 正负样本匹配规则三. 为每一个 anchor box 打标签3.1 anchor box 长什么样?3.2 每一个 anchor box 标签需要填充的信息有哪些?3.3 ( Δ x , Δ y , Δ w , Δ h ) (\Delta x, \Delta y, \Delta w, \Delta h) (Δx,Δy,…

uniapp交互反馈api的使用示例

官方文档链接&#xff1a;uni.showToast(OBJECT) | uni-app官网 1.uni.showToast({}) 显示消息提示框。 常用属性&#xff1a; title:页面提示的内容 image&#xff1a;改变提示框默认的icon图标 duration&#xff1a;提示框在页面显示多少秒才让它消失 添加了image属性后。 注…

vs code 设置了自动格式化保存 但是json 配置文件不想自动格式化

vscode 点击文件>首选项>设置>点击打开设置 >转化成文本格式 "editor.formatOnSave": true, "[json]": { "editor.formatOnSave": false }, 即可

智安网络|计算机视觉在城市交通中的前景与变化

随着科技的不断发展&#xff0c;计算机视觉技术在各个领域扮演着越来越重要的角色。在交通领域&#xff0c;计算机视觉为智能交通系统带来了许多机遇&#xff0c;为城市交通管理和出行体验提供了前所未有的可能性。 首先&#xff0c;计算机视觉技术可以用于智能交通监控。传统…

力扣题:数字与字符串间转换-12.15

力扣题-12.15 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;592. 分数加减运算 解题思想&#xff1a;首先通过对表达式进行分离&#xff0c;然后利用分数的加法原则进行计算&#xff0c;最后除以最大公因数即可 class Solution(object):def fra…

【MATLAB】数据拟合第10期-二阶多项式的局部加权回归拟合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 二阶多项式局部加权回归拟合算法是一种用于回归分析的方法&#xff0c;主要通过局部加权线性回归模型来实现。以下是对二阶多项式局部加权回归拟合算法的介绍&#xff1a; 局部加权线性回…

微信小程序 实现上传图片前裁剪功能

前言 技术支持&#xff1a; wx-cropper 裁剪 总体思路是&#xff1a;安装完wx-cropper之后就它当成组件使用。在使用页面的地方引入组件就行。上传图片的逻辑不变&#xff0c;在 通过wx.chooseMedia() Api 拿到图片之后传递给子组件&#xff0c;子组件在拿到图片进行裁剪处理等…

ChatGPT如何做科研??

2023年我们进入了AI2.0时代。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车&#xff0c;就有可能被淘汰在这个数字化时代&#xff0c;如何能高效地处理文本、文献查阅、PPT…

算法:单链表反转

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、问题描述 二、栈解法Stack 三、三指针法 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、问题描述 有个单链表&#xff0c;现…

Gitlab基础篇: Gitlab docker 安装部署、Gitlab 设置账号密码

文章目录 1、环境准备2、配置1)、初始化2)、修改gitlab配置文件3)、修改docker配置的gitlab默认端口 gitlab进阶配置gitlab 设置账号密码 1、环境准备 安装docker gitlab前确保docker环境&#xff0c;如果没有搭建docker请查阅“Linux docker 安装文档” docker 下载 gitlab容…