• 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

  • 相关阅读:
    使用 AWS boto3 库从 s3 桶中批量下载数据
    Solidity 小白教程:12. 事件
    点云从入门到精通技术详解100篇-基于点云数据的机器人动态分拣(续)
    SpringMVC原理学习(二)参数解析器
    安化云台山又添一新的打卡点——星空露营公园
    Git基本使用
    SuperMap iClient for JavaScript如何获取字段别名
    用OpenCV进行图像分割--进阶篇
    许战海战略文库|隆基绿能,光伏龙头如何走出战略无人区?
    Dlang 并行化
  • 原文地址:https://blog.csdn.net/xianghanscce/article/details/125901283