SpringBoot-自定义Starter精华版

SpringBoot自定义Starter精华版

一、自定义 Starter 分析

项目首先加载 starter,starter加载自动配置类,然后再通过配置绑定对象读取配置属性,注册组件。

在这里插入图片描述

二、实现步骤

开发的自定义 Starter 需求是,项目依赖starterTest-spring-boot-starter,starterTest-spring-boot-starter 又加载HelloAutoConfiguration,HelloAutoConfiguration自动产生HelloService,项目中引入 starterTest-springboot-start后,用户便可以使用HelloAutoConfiguration 产生的 HelloService 了

1、配置POM文件

引入spring-boot-configuration-processor依赖

spring-boot-configuration-processor 依赖是 Spring Boot 提供的一个注解处理器,主要用于生成配置类的元数据信息,以支持 IDE 的自动补全和代码提示功能。

具体来说,spring-boot-configuration-processor 依赖的作用包括:

  1. 生成 application.propertiesapplication.yml 文件的元数据信息

    • 当你使用 @ConfigurationProperties 注解来绑定配置属性时,通常需要在 IDE 中能够自动补全和提示这些属性的名称、类型和描述信息spring-boot-configuration-processor 会扫描你的配置类,并生成相应的元数据信息,供 IDE 使用
  2. 提供编译时错误检查

    • 使用 spring-boot-configuration-processor 可以在编译时检查配置属性的正确性,比如属性名称拼写错误、类型不匹配等。这有助于提早发现并修复配置错误,减少运行时的问题。
  3. 提高开发效率

    • 通过生成配置属性的元数据信息,开发者可以在 IDE 中获得更好的开发体验,包括自动补全、代码提示、快速导航等功能,从而提高开发效率。

    综上所述,spring-boot-configuration-processor 依赖的主要作用是提供配置属性的元数据信息,以支持 IDE 的自动补全和代码提示功能,同时提供编译时的错误检查,帮助开发者更快地开发和调试 Spring Boot 应用程序。

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.kdz</groupId>
    <artifactId>starterTest-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>starterTest</name>
    <description>starterTest</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <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.18.22</version>
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>

2、配置XXXProperties属性绑定对象

在自动配置类中使用配置绑定对象 HelloProperties 读取 com.kdz 前缀的配置参数,提供给自动配置类产生的 HelloService 使用,代码如下。

package com.kdz.demo.config;

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

@ConfigurationProperties(prefix = "con.kdz")
@Data
public class HelloProperties {

    private String name;
    private String message;

}

@ConfigurationProperties 注解用于将外部配置文件中的属性值绑定到 Spring Boot 应用程序中的 JavaBean 类的属性上。

3、配置XXXServiceAutoConfiguration对象

在自动配置 HelloServiceAutoConfiguration 类中会自动产生 HelloService,这样引入了 starterTest-spring-boot-starter 场景启动器的 Spring Boot 工程就都可以使用HelloService 了,代码如下:

package com.kdz.demo.config;

import com.kdz.demo.service.HelloService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfiguration {

    @ConditionalOnMissingBean(HelloService.class)
    @Bean
    public HelloService helloService(){
        HelloService helloService = new HelloService();
        return helloService;
    }
}

@Configuration

  • 说明:该注解标记一个类作为配置类,指示 Spring 应用程序应该在启动时加载并处理其 bean 定义
  • 使用场景:通常用于标记自动配置类,以确保 Spring 在启动时加载这些配置

@ConditionalOnMissingBean

  • 说明:与 @ConditionalOnBean 相反,该注解根据 Spring 容器中是否缺少某个特定的 bean 来条件化地应用自动配置
  • 使用场景:当你的 Starter 需要确保某个 bean 尚未被定义时才生效时,可以使用此注解。

@ConditionalOnBean

  • 说明:该注解根据 Spring 容器中是否存在某个特定的 bean 来条件化地应用自动配置
  • 使用场景:当你的 Starter 需要某个 bean 已经被其他 Starter 或用户配置定义时才生效时,可以使用此注解

@EnableConfigurationProperties

  • @EnableConfigurationProperties 注解的作用是启用指定的 @ConfigurationProperties 注解标记的类,从而将其加载到 Spring 应用程序的上下文中,并使其可用于注入到其他组件中。

4、配置XXXService 类

自动配置类产生的 HelloService 代码如下:

package com.kdz.demo.service;

import com.kdz.demo.config.HelloProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class HelloService {
    @Autowired
    HelloProperties helloProperties;
    public String sayHello(String name,String message){
        return name+message;
    }
}

5、META-INF/spring.factories 文件

自动配置类需要配置在META-INF/spring.factories,具体代码如下

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.kdz.demo.config.HelloServiceAutoConfiguration

META-INF/spring.factories 文件在 Spring Boot 自动配置中扮演着重要的角色。它的作用主要体现在以下几个方面:

  1. 自动配置的注册

    • META-INF/spring.factories 文件是 Spring Boot 自动配置的核心配置文件之一。在这个文件中,通过指定特定的键值对形式,可以注册自动配置类。Spring Boot 在启动时会扫描这个文件,加载其中的配置,从而自动注册这些配置类到应用程序的上下文中。
  2. 指定自动配置类的位置

    • META-INF/spring.factories 文件中,通过指定 org.springframework.boot.autoconfigure.EnableAutoConfiguration 键下的值,可以告诉 Spring Boot 在启动时自动加载并应用相应的自动配置类。这些自动配置类通常包含了对应用程序进行默认配置的逻辑,比如加载默认的数据源、配置默认的日志输出等。
  3. 扩展点

    • 开发者可以在自己的项目中创建自定义的自动配置类,并将其注册到 META-INF/spring.factories 文件中。这样,这些自定义的自动配置类就可以在应用程序启动时被自动加载和应用,从而实现项目的定制化配置
  4. 模块化管理

    • Spring Boot 框架本身也使用 META-INF/spring.factories 文件来管理自身的模块和自动配置。在 Spring Boot 的依赖中,不同模块的自动配置类会分别注册到 spring.factories 文件中的不同位置,从而实现模块化管理和灵活组合

    综上所述,META-INF/spring.factories 文件在 Spring Boot 自动配置中起着关键的作用,通过这个文件可以注册和加载自动配置类,实现应用程序的默认配置和定制化配置

6、安装自定义starter到本地maven仓库

1)方法一:IDEA的maven插件安装

当自定义starter配置好后,直接使用IDEA的maven插件安装,点击install,即可

在这里插入图片描述

在这里插入图片描述

方法二、cmd+maven命令安装
 mvn install:install-file -DgroupId=com.kdz -DartifactId=starterTest-spring-boot-starter -Dversion=0.0.1 -Dfile=E:/Code/SpringBoot/starterTest/starterTest-spring-boot-starter-0.0.1-SNAPSHOT.jar -Dpackaging=jar

在这里插入图片描述

方法三:IDE的控制台+maven命令安装
参数:
    -Dfile  jar包在本地实际位置的绝对路径
    -DgroupId   jar包的groupId,也对应打包后想要生成的目录
    -DartifactId    jar包的artifactId,名称随意即可
    -Dversion   jar包的版本号,对应即可
    -Dpackaging 指定打包成jar包形式

在这里插入图片描述

 mvn install:install-file -DgroupId="com.kdz" -DartifactId="starterTest-spring-boot-starter" -Dversion="0.0.1" -Dfile="E:/Code/SpringBoot/starterTest/starterTest-spring-boot-starter-0.0.1-SNAPSHOT.jar" -Dpackaging=jar

注意:-Dfile-DgroupId-DartifactId-Dversion的值,最好都带上引号,因为空格、-、.等符号都会截断后面的值,比如:starterTest-spring-boot-starter可能只有starterTest

在这里插入图片描述

三、使用自定义的starter

在另外一个项目的POM文件中,引用依赖自定义的starter使用即可

在这里插入图片描述

能够索引到依赖,有提示,即可以使用了

在这里插入图片描述

至此SpringBoot自定义Starter精华版完结

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

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

相关文章

C++界面设计之道:利用Qt框架构建优雅高效的应用程序

引言 Qt是一款强大的跨平台C图形用户界面&#xff08;GUI&#xff09;应用程序开发框架&#xff0c;以其丰富的功能、高效的性能、优雅的API以及出色的跨平台能力深受开发者喜爱。本篇文章将以《C界面如何设计Qt程序&#xff1f;》为主题&#xff0c;详细介绍如何利用Qt框架设…

python路径不对安装不了pip文件

因为特殊原因改变了路径&#xff0c;所以原来安装的路径不对无法通过环境变量的改变来完成安装&#xff0c;解决方法&#xff1a; 1.卸载重新安装&#xff0c;在安装界面会出现一个界面&#xff0c;直接打勾&#xff0c;安装结束后路径会配置完成 2在环境变量与用户变量处键入…

小程序 SSL证书的重要性与选择

随着移动互联网的迅猛发展&#xff0c;微信小程序已成为众多企业和开发者连接用户的重要平台。然而&#xff0c;随之而来的是对数据安全和隐私保护的严峻挑战。在这一背景下&#xff0c;小程序SSL证书的作用变得尤为重要&#xff0c;它为小程序提供了一个安全的通信管道&#x…

分享几个有趣实用的冷知识,涨姿势了

之前分享过分享几个有趣实用的冷知识&#xff0c;涨姿势了 &#xff0c;今天再补充分享些实用冷知识&#xff0c;持续更新&#xff0c;建议收藏这篇文章。 1.很多人不知道安卓软件文件名后缀apk&#xff0c;ios软件文件名后缀ipa&#xff0c;mac软件文件名后缀dmg&#xff0c;…

项目5-博客系统2(实现登录-令牌技术)

1.实现登录 分析 传统思路: • 登陆⻚⾯把⽤⼾名密码提交给服务器. • 服务器端验证⽤⼾名密码是否正确, 并返回校验结果给后端 • 如果密码正确, 则在服务器端创建 Session . 通过 Cookie 把 sessionId 返回给浏览器 问题: 集群环境下⽆法直接使⽤Session. 原因分析:…

【c 语言】结构体的定义格式及变量初始化

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

Python零基础从小白打怪升级中~~~~~~~SQLAlchemy的介绍

第四节&#xff1a;SQLAlchemy操作数据库 一、SQLAlchemy介绍 SQLAlchemy 是 Python 中一个通过 ORM 操作数据库的框架。 SQLAlchemy对象关系映射器提供了一种方法&#xff0c;用于将用户定义的Python类与数据库表相关联&#xff0c;并将这些类&#xff08;对象&#xff09;…

SpringAI初体验之HelloWorld

目录 前言1.准备工作2.初始化项目3.解决问题3.1 Connection Time out 连接超时问题3.2 You exceeded your current quota 额度超限问题 4.访问调用5.总结 前言 在逛SpringBoot页面时突然看到页面上新增了一个SpringAI项目,于是试了一下&#xff0c;感觉还行。其实就是封装了各家…

C语言处理文本模板:格式信函编程

开篇 本篇文章的问题来源为《编程珠玑》第3章其中一个问题&#xff0c;格式信函编程。说白了就是先在文件中定义一个文本模版&#xff0c;然后使用数据库中的数据去填充这个模版&#xff0c;最后得到填充后的文本&#xff0c;并输出。 问题概要 在常去的网店键入你的名字和密码…

LiveGBS流媒体平台GB/T28181功能-国标级联中如何自定义通道国标编号编辑通道编号保持唯一性

LiveGBS国标级联中如何自定义通道国标编号编辑通道编号保持唯一性 1、国标级联选择通道修改2、通道编辑修改3、分屏展示设备树修改3.1、编辑名称中修改 4、分屏展示分组修改4.1、编辑名称中修改4.2、选择通道中修改 5、搭建GB28181视频直播平台 1、国标级联选择通道修改 国标级…

graylog使用Sidecars方式收集springboot程序的日志

1、部署graylog后台服务 使用docker-compose启动三个服务程序&#xff0c;包括graylog、mongodb、opensearch。 docker-compose.yml内容如下 version: 3 services: # MongoDB: https://hub.docker.com/_/mongo/ mongodb: image: mongo:6.0.14 privileged: true …

BGP扩展知识总结

一、BGP的宣告问题 在BGP协议中每台运行BGP的设备上&#xff0c;宣告本地直连路由在BGP协议中运行BGP协议的设备&#xff0c;来宣告通过IGP学习到的未运行BGP协议设备产生的路由&#xff1b;&#xff08;常见&#xff09; 在BGP协议中宣告本地路由表中路由条目时&#xff0c;将…

CSS导读 (元素显示模式 下)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 3.6 元素显示模式转换 3.7 (一个小技巧)单行文字垂直居中的代码 3.8 单行文字垂直居中的原理 3.9 小案例…

对称排序.

1.对称排序 - 蓝桥云课 (lanqiao.cn) 问题描述 小蓝是一名软件工程师&#xff0c;他正在研究一种基于交换的排序算法&#xff0c;以提高排序的效率。 给定一个长度为N 的数组A&#xff0c;小蓝希望通过交换对称元素的方式对该数组进行排序。 具体来说&#xff0c;小蓝可以对数组…

微信小程序报错——“errno“: 600001, “errMsg“: “request:fail -2:net::ERR_FAILED“

bug现象 微信小程序体验版和真机调试 进入小程序的时候接口就出现了这个报错 "errno": 600001, "errMsg": "request:fail -2:net::ERR_FAILED" 排查 检查是证书过期还是证书链不完整 证书的信任链完整问题&#xff0c;可以在 亚数信息-SSL/TLS安…

JavaScript(五)-正则表达式

文章目录 正则表达式正则表达式的介绍语法元字符修饰符 正则表达式 正则表达式的介绍 什么是正则表达式 正则表达式&#xff08;Regular expression&#xff09;是用于匹配字符串中字符组合的模式&#xff0c;在JavaScript中&#xff0c;正则表达式也是对象通常用来查找、替…

计算机三级数据库技术备考笔记(十二)

第十二章 备份与恢复数据库 备份与恢复的概念 备份数据库就是将数据库中的数据以及保证数据库系统正常运行的有关信息保存起来&#xff0c;以备系统出现问题时恢复数据库时使用。 备份数据库 备份是制作数据库的副本,包括数据库结构、对象和数据。备份数据库的主要目的是为了防…

IMU状态预积分的雅克比矩阵

IMU状态预积分的雅克比矩阵 预积分的雅克比矩阵 预积分的雅克比矩阵 最后讨论预积分相对状态变量的雅克比矩阵。由于预积分测量已经归纳了IMU在短时间内的读数&#xff0c;因此残差相对于状态变量的雅克比矩阵推导则简单。 首先考虑旋转。 旋转与Ri,Rj和 b g , i b_{g,i} bg,i…

在windows中anaconda中安装fasttext (whl 文件安装)

Anaconda安装第三方包&#xff08;whl文件&#xff09; windows 安装fasttext 一直不成功&#xff0c;python 版本3.8 网上教程都是 https://www.lfd.uci.edu/~gohlke/pythonlibs/#fasttext 下载然后安装&#xff0c;但是这个网站里我没找到哈哈哈。。。 然后就是成功方案&am…

IO——标准IO

1.1概念 标准IO&#xff1a;是在C库中定义的一组专门用于输入输出的函数。 1.2特点 &#xff08;1&#xff09;通过缓冲机制减少系统调用&#xff0c;提高效率 &#xff08;2&#xff09;围绕流操作&#xff0c;用FILE*描述 &#xff08;3&#xff09;标准IO默认打开三个流&a…