每个springboot开发者必会的自定义starter

以下是Spring Boot自定义Starter的完整实现指南,结合最佳实践与核心原理:

一、核心概念

  1. Starter本质
    将功能模块的依赖、配置、自动装配逻辑封装为可复用的JAR包,遵循"约定大于配置"原则56。

    • 作用‌:简化依赖管理,避免手动配置(如MyBatis Starter自动配置SqlSessionFactory)。
    • 命名规范‌:xxx-spring-boot-starter(第三方jar)或spring-boot-starter-xxx(spring官方jar)。
  2. 关键组件

    • 自动配置类‌:通过@Conditional系列注解实现条件装配;
    • 属性配置类‌:绑定application.yml中的自定义参数;
    • spring.factories:注册自动配置类到Spring容器;

二、实现步骤(以自定义数据脱敏Starter为例)

1. demo-spring-boot-starter/pom.xml

<!-- demo-spring-boot-starter/pom.xml -->
<!-- 必须包含spring-boot-starter基础依赖 -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <!-- 可选:添加Lombok简化代码 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

2. com.example.DesensitizeProperties

@Data // lombok 生成getter setter 方法
@ConfigurationProperties(prefix = "desensitize")
public class DesensitizeProperties {
    private String pattern = "\\d{4}"; // 默认匹配4位数字
    private String replacement = "****";
}

3. com.example.DesensitizeAutoConfiguration

@Configuration // IOC
@EnableConfigurationProperties(DesensitizeProperties.class) // 开启配置文件中的参数接收
//@ConditionalOnClass(DesensitizeService.class) // 指定类时开启注解
public class DesensitizeAutoConfiguration {

    @Bean //创建Bean对象,交由spring管理
    //@ConditionalOnMissingBean //条件注解,用于在只有当Spring容器中不存在某个Bean时,才创建该Bean。常用于自动配置和模块化设计中,允许开发者在需要时提供自定义实现,同时保留默认实现作为兜底方案‌
    public DesensitizeService desensitizeService(DesensitizeProperties props) {
        return new DesensitizeService(props);
    }
}

4. 使用

其他项目引用:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>demo-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

其他项目yaml配置:

desensitize:
  pattern: "\d{3}"
  replacement: "###"

方式一:约定大于配置方式,demo-spring-boot-starter的META-INF里 ,约定在此文件下带有默认名称的文件中的class交由spring管理

SpringBoot2项目,resources/META-INF/spring.factories

其中spring.factories是文件名称

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.DesensitizeAutoConfiguration

SpringBoot3项目,resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

其中org.springframework.boot.autoconfigure.AutoConfiguration.imports是文件名称

com.example.DesensitizeAutoConfiguration

防止项目存在的兼容性问题,建议2个都进行配置。

方式二:采用Import方式配置

在启动类上添加@Import(DesensitizeAutoConfiguration.class)

方式三:采用自定义注解方式

添加Importselector实现

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class MyInport implements Importselector {

    public string[] selectImports(AnnotationMetadata importingClassMetadata){
        return new string[]{DesensitizeAutoConfiguration.class.getName()
    };

}

添加自定义注解 

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(MyInport.class)
public @interface EnableUtil

在项目启动类上添加@EnableUtil注解

上述3种使用方法,建议使用第一种,引入jar开箱即用,减少侵入。

三、高级技巧

  1. 条件控制
    使用@ConditionalOnProperty@ConditionalOnWebApplication等精确控制装配条件。
  2. 自定义注解
    通过@Import导入配置类,实现更灵活的启用方式。
  3. 版本兼容
    pom.xml中声明<dependencyManagement>管理依赖版本。

补充说明:springboot自动装配的核心注解@Import

  • 参数如果是普通类:将该类实例化交给IOC容器管理
  • 参数如果是ImportBeanDefinitionRegistrar的实现类:支持手工注册bean
  • 参数如果是ImportSelector的实现类:注册selectlmports返回的数组(类全路径)到I0C容器 批量注册

starter典型应用场景:日志增强、分布式锁、API签名验证等通用模块封装。通过Starter可实现企业级技术中台建设

如还有不太明白的地方,可以咨询博主哦😄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值