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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听