SpringBoot-自定义Starter精华版

2024-04-13 06:44

本文主要是介绍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)@Beanpublic 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 {@AutowiredHelloProperties 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精华版完结

这篇关于SpringBoot-自定义Starter精华版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899403

相关文章

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决Spring运行时报错:Consider defining a bean of type ‘xxx.xxx.xxx.Xxx‘ in your configuration

《解决Spring运行时报错:Considerdefiningabeanoftype‘xxx.xxx.xxx.Xxx‘inyourconfiguration》该文章主要讲述了在使用S... 目录问题分析解决方案总结问题Description:Parameter 0 of constructor in x

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug