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
依赖的作用包括:
-
生成
application.properties
或application.yml
文件的元数据信息:- 当你使用
@ConfigurationProperties
注解来绑定配置属性时,通常需要在 IDE 中能够自动补全和提示这些属性的名称、类型和描述信息。spring-boot-configuration-processor
会扫描你的配置类,并生成相应的元数据信息,供 IDE 使用。
- 当你使用
-
提供编译时错误检查:
- 使用
spring-boot-configuration-processor
可以在编译时检查配置属性的正确性,比如属性名称拼写错误、类型不匹配等。这有助于提早发现并修复配置错误,减少运行时的问题。
- 使用
-
提高开发效率:
- 通过生成配置属性的元数据信息,开发者可以在 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 自动配置中扮演着重要的角色。它的作用主要体现在以下几个方面:
-
自动配置的注册:
META-INF/spring.factories
文件是 Spring Boot 自动配置的核心配置文件之一。在这个文件中,通过指定特定的键值对形式,可以注册自动配置类。Spring Boot 在启动时会扫描这个文件,加载其中的配置,从而自动注册这些配置类到应用程序的上下文中。
-
指定自动配置类的位置:
- 在
META-INF/spring.factories
文件中,通过指定org.springframework.boot.autoconfigure.EnableAutoConfiguration
键下的值,可以告诉 Spring Boot 在启动时自动加载并应用相应的自动配置类。这些自动配置类通常包含了对应用程序进行默认配置的逻辑,比如加载默认的数据源、配置默认的日志输出等。
- 在
-
扩展点:
- 开发者可以在自己的项目中创建自定义的自动配置类,并将其注册到
META-INF/spring.factories
文件中。这样,这些自定义的自动配置类就可以在应用程序启动时被自动加载和应用,从而实现项目的定制化配置。
- 开发者可以在自己的项目中创建自定义的自动配置类,并将其注册到
-
模块化管理:
- Spring Boot 框架本身也使用
META-INF/spring.factories
文件来管理自身的模块和自动配置。在 Spring Boot 的依赖中,不同模块的自动配置类会分别注册到spring.factories
文件中的不同位置,从而实现模块化管理和灵活组合。
综上所述,
META-INF/spring.factories
文件在 Spring Boot 自动配置中起着关键的作用,通过这个文件可以注册和加载自动配置类,实现应用程序的默认配置和定制化配置。 - 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精华版完结