自定义 Spring Boot Starter

自定义 Spring Boot Starter

参考自:www.wanyj.cn/article/cus...

1. 命名规范

  • 官方的命名方式:spring-boot-starter-xxx
  • 第三方命名方式:xxx-spring-boot-starter

2. 功能开发

2.1. 引入基础依赖

xml 复制代码
<!-- Spring Boot Starter基础依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 自动配置核心依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<!-- 用于生成配置元数据,提供IDE提示支持 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
<!-- 其他你需要的依赖 -->

2.2. 编写配置信息类

java 复制代码
import cn.wanyj.component.dcc.types.common.Constants;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "wanyj.component.dcc", ignoreInvalidFields = true)
public class DynamicConfigCenterAutoConfigProperties {

    private String system;

    public String getFinalAttributeName(String attributeName) {
        return this.system + Constants.UNDERLINE + attributeName;
    }

    public String getSystem() {
        return system;
    }

    public void setSystem(String system) {
        this.system = system;
    }
}

这样你就可以在yml文件中配置了

yml 复制代码
wanyj:
  component:
    dcc:
      system: test

2.3. 完成业务逻辑,编写自动配置类

java 复制代码
import cn.wanyj.component.dcc.domain.entity.AttributeEntity;
import cn.wanyj.component.dcc.domain.service.DynamicConfigCenterService;
import cn.wanyj.component.dcc.domain.service.DynamicConfigCenterServiceImpl;
import cn.wanyj.component.dcc.listener.DynamicConfigCenterAdjustListener;
import cn.wanyj.component.dcc.types.common.Constants;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(value = DynamicConfigCenterAutoConfigProperties.class)
public class DynamicConfigCenterRegisterAutoConfig {

    @Bean
    public DynamicConfigCenterService dynamicConfigCenterService(DynamicConfigCenterAutoConfigProperties properties, RedissonClient redissonClient) {
        return new DynamicConfigCenterServiceImpl(properties, redissonClient);
    }

    @Bean
    public DynamicConfigCenterAdjustListener dynamicConfigCenterAdjustListener(DynamicConfigCenterService dynamicConfigCenterService) {
        return new DynamicConfigCenterAdjustListener(dynamicConfigCenterService);
    }

    @Bean
    public RTopic dynamicConfigCenterRedisTopic(DynamicConfigCenterAutoConfigProperties properties, RedissonClient redissonClient, DynamicConfigCenterAdjustListener dynamicConfigCenterAdjustListener) {
        RTopic topic = redissonClient.getTopic(Constants.getTopic(properties.getSystem()));
        topic.addListener(AttributeEntity.class, dynamicConfigCenterAdjustListener);
        return topic;
    }
}

2.4. 使starter生效

  • 方式一:注解启动

你需要自定义一个启动注解

java 复制代码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({DynamicConfigCenterRegisterAutoConfig.class}) // [!code highlight]
public @interface EnableDCC {
}

然后使用时需要在启动类添加这个注解

java 复制代码
@SpringBootApplication
@EnableDCC // [!code highlight]
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  • 方式二:自动生效
    • 通过 SpringBoot 的 SPI 的机制来去加载我们的 Starter
    • 需要创建resource/META-INF/spring.factories文件
      • key 为 org.springframework.boot.autoconfigure.EnableAutoConfiguration
      • value 为自动配置类的全限定名(记得去除前后的空格,否则会不生效)
[spring.factories] 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.wanyj.component.dcc.config.DynamicConfigCenterRegisterAutoConfig

!WARNING\] 注意 在 Springboot3+ 版本完全移除了 spring.factories 的方式 需要更改目录结构为 `resource/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` ```[org.springframework.boot.autoconfigure.AutoConfiguration.imports] cn.wanyj.component.dcc.config.DynamicConfigCenterRegisterAutoConfig ```

相关推荐
fisher_sky12 小时前
流媒体服务mediamtx和FFMpeg工具链联合实验
后端
qq_124987075312 小时前
基于SSM框架的智能密室逃脱信息管理系统(源码+论文+部署+安装)
java·大数据·人工智能·spring boot·后端·毕业设计·计算机毕业设计
掉鱼的猫12 小时前
从 Chat 到 Agent:Solon AI 带你进入“行动派”大模型时代
后端
vivo互联网技术12 小时前
vivo 微服务架构实践之 Dubbo 性能优化
java·后端·微服务·中间件·dubbo
仙俊红12 小时前
Spring 构造器注入 vs 字段注入
java·后端·spring
0和1的舞者12 小时前
Spring 事务核心知识点全梳理(编程式 + 声明式 + 注解详解)
java·后端·spring
风象南13 小时前
Spring Boot 中使用 JSONPath 高效处理 JSON 数据
后端
用户6956194403713 小时前
PageOffice最简集成代码(SpringMVC)
java·后端
程序员爱钓鱼13 小时前
Node.js 编程实战:博客系统 —— 用户注册登录与文章管理
前端·后端·node.js
掘金者阿豪13 小时前
在Java项目中,如果没有使用Redis相关的代码或依赖,但在 `application.yaml` 配置文件中配置了Redis参数,项目启动时是否会报错
后端