• 4-SpringBoot架构设计与实现原理-SpringBoot自定义starter


    SpringBoot自定义starter

    创建项目nx-uid-starter

    <groupId>com.naixue.springbootgroupId>
    <artifactId>nx-uuid-starterartifactId>
    
    • 1
    • 2

    引入jar包 hutool

    我们经常使用到生成主键ID,那么我们今天的做一个开箱即用的starter,基于推特的雪花算法。

    <dependency>
        <groupId>cn.hutoolgroupId>
        <artifactId>hutool-allartifactId>
        <version>4.5.15version>
        <optional>trueoptional>
    dependency>
    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-actuatorartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    演示雪花算法

    IdUtil.createSnowflake(workerId,datacenterId).nextId();

    使用方添加配置文件

    application.properties

    naixue.spring.uuid.info.workerId=1
    naixue.spring.uuid.info.datacenterId=1
    
    • 1
    • 2

    我们开始定义参数配置类

    @ConfigurationProperties(prefix =UUIDProperties.NX_UID_PREFIX)
    public class UUIDProperties {
        public static final String NX_UID_PREFIX="naixue.spring.uuid";
        private Map<String, String> info;
    
        public Map<String, String> getInfo() {
            return info;
        }
    
        public void setInfo(Map<String, String> info) {
            this.info = info;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    定义处理器接口

    public interface IUUIDProcessor {
        String getUUID(UUIDProperties properties);
    }
    
    • 1
    • 2
    • 3

    定义UUIDProcessorImpl

    public class UUIDProcessorImpl implements IUUIDProcessor {
        @Override
        public String getUUID(UUIDProperties properties) {
            UUID uuid = UUID.randomUUID();
            System.out.println("UUID="+uuid);
            return uuid.toString();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    定义SnowFlakeProcessorImpl

    public class SnowFlakeProcessorImpl implements IUUIDProcessor {
        @Override
        public String getUUID(UUIDProperties properties) {
            String workerId = properties.getInfo().get("workerId");
            String datacenterId = properties.getInfo().get("datacenterId");
            long id = IdUtil.createSnowflake(Long.valueOf(workerId), Long.valueOf(datacenterId)).nextId();
            System.out.println("SnowFlakeID="+id);
            return String.valueOf(id);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    自动装配bean

    @Configuration
    public class UUIDConfiguration {
        @Bean
        @Primary
        @ConditionalOnMissingClass(value = "cn.hutool.core.util.IdUtil")
        public IUUIDProcessor getUUID() {
            return new UUIDProcessorImpl();
        }
    
        @Bean
        @ConditionalOnClass(name = "cn.hutool.core.util.IdUtil")
        public IUUIDProcessor getSnowFlakeUUID() {
            return new SnowFlakeProcessorImpl();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    定义给使用调用的service

    public class NXUUIDTemplate {
        private UUIDProperties uuidProperties;
        private IUUIDProcessor iuuidProcessor;
    
        public NXUUIDTemplate(IUUIDProcessor iuuidProcessor, UUIDProperties uuidProperties) {
            this.iuuidProcessor = iuuidProcessor;
            this.uuidProperties = uuidProperties;
        }
    
        public String getUUid() {
            return iuuidProcessor.getUUID(uuidProperties);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    定义自动装载类

    @Import(UUIDConfiguration.class)
    @EnableConfigurationProperties(UUIDProperties.class)
    @Configuration
    public class UUIDAutoConfiguration {
        @Bean
        public NXUUIDTemplate NXUIDTemplate(IUUIDProcessor iuuidProcessor, UUIDProperties uuidProperties) {
            return new NXUUIDTemplate(iuuidProcessor, uuidProperties);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    定义SPI文件

    META-INF/spring.factories

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.naixue.springboot.starter.UUIDAutoConfiguration
    
    • 1

    使用方添加依赖

    <dependency>
              <groupId>com.naixue.springbootgroupId>
              <artifactId>nx-uuid-starterartifactId>
              <version>0.0.1-SNAPSHOTversion>
    dependency>
    
          
              
              
              
          
    
          <dependency>
              <groupId>org.springframework.bootgroupId>
              <artifactId>spring-boot-starter-actuatorartifactId>
          dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    使用

    @SpringBootApplication
    public class FriendApplication {
    
        @Autowired
        public void setNxuuidTemplate(NXUUIDTemplate nxuuidTemplate) {
            FriendApplication.nxuuidTemplate = nxuuidTemplate;
        }
        private static NXUUIDTemplate nxuuidTemplate;
    
        public static void main(String[] args) {
            SpringApplication.run(FriendApplication.class, args);
            nxuuidTemplate.getUUid();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

  • 相关阅读:
    论文阅读(7)水母游动的流体动力学 - 海洋科学年刊(2021)
    Centos 常用软件的安装与配置精简版
    Jupyter上报:ModuleNotFoundError: No module named ‘xgboost‘
    1.4-19:简单计算器
    C---字符串
    Docker:docker 拉取镜像及查看pull下来的image在哪里
    java项目-第127期SpringBoot+vue的智慧养老手表管理系统-java毕业设计_计算机毕业设计
    微信小程序获取当前日期时间
    【云栖 2023】张治国:MaxCompute 架构升级及开放性解读
    python 为 网易云下载的 本地音乐文件增加 序号
  • 原文地址:https://blog.csdn.net/xianghanscce/article/details/125901283