美文网首页
基于SpringBoot手写starter

基于SpringBoot手写starter

作者: 李小二的倔强 | 来源:发表于2021-05-17 16:31 被阅读0次

    曲木为直终必弯,养狼当犬看家难。墨染鸬鹚黑不久,粉刷乌鸦白不坚。
    蜜饯黄莲终需苦,强摘瓜果不能甜。好事总得善人做,哪有凡人做神仙

    Spring Boot 将常见的开发功能,分成了一个个的starter,这样我们开发功能的时候只需要引入对应的starter,而不需要去引入一堆依赖了!starter可以理解为一个依赖组,其主要功能就是完成引入依赖和初始化配置。Spring 官方提供的starter 命名规范为 spring-boot-starter-xxx ,第三方提供的starter命名规范为 xxx-spring-boot-starter 。

    一、新建项目

    新建一个名为 rsocket-spring-boot-starter 的项目,并且引入下面的依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    

    二、新增配置类

    配置类对应的properties文件中的属性为tcp.ip;

    @ConfigurationProperties(prefix = "tcp")
    public class RsocketPorperties {
        private String ip;
    
        public String getIp() {
            return ip;
        }
    
        public void setIp(String ip) {
            this.ip = ip;
        }
    }
    

    三、新增节点获取Id的方法

    该方法主要就是像读取的ip节点发送内容

    @Slf4j
    public class Node {
        private String ip;
    
        public String getIp() {
            return ip;
        }
    
        public void setIp(String ip) {
            this.ip = ip;
        }
    
        public String send(String data){
    
            RSocketStrategies strategies = RSocketStrategies.builder()
                .encoders(encoders -> encoders.add(new Jackson2CborEncoder()))
                .decoders(decoders -> decoders.add(new Jackson2CborDecoder()))
                .build();
    
            //创建Rsocket
            RSocketRequester requester = RSocketRequester.builder()
                .rsocketStrategies(strategies)
                .tcp(getIp(), 7000);
    
            //发送消息到服务器端
            Message message = requester
                .route("contract-request")
                .data(new Message("Client", "Request", data))
                .retrieveMono(Message.class)
                .block();
            log.info("客户端收到响应 {}", message);
    
            return  "success --- "+ getIp();
        }
    }
    

    四、新增自动配置类

    使用注解 @EnableConfigurationProperties 启用 JavatipProperties 配置类
    使用注解 @Configuration 配合 @Bean 注册一个拼接字符串的bean对象。

    @Configuration
    @EnableConfigurationProperties(RsocketPorperties.class)
    public class RsocketAutoConfiguration {
    
        @Autowired
        private RsocketPorperties rsocketPorperties;
    
        @Bean
        public Node getNode(){
            Node node = new Node();
            node.setIp(rsocketPorperties.getIp());
            return node;
        }
    }
    

    五、新增配置发现文件

    resources文件夹中新建 META-INF 文件夹,在 META-INF 文件夹中新建配置发现文件 spring.factories,并且将自动配置类写到文件里。

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.opendatachain.config.RsocketAutoConfiguration
    

    六、编写pom文件

    作者就是编写.pom文件是打包方式不对就错了,找了好久才发现问题

    注意:如下这是错误方式,这种打包是会把springboot的内置服务器 tomcat/netty 打包到jar包中,这种方式在如下测试类中导包没问题,但是类引入不了。

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    

    正确打包方式如下:

    <properties>
        <java.version>11</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    </properties>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    六、打包测试

    使用 mvn clean install 命令将项目打包推送到本地maven仓库,然后新建一个测试项目,引入打包好的依赖。

    <dependency>
          <groupId>cn.opendatachain</groupId>
          <artifactId>odc-rsocket-starter</artifactId>
          <version>0.1.0</version>
    </dependency>
    

    application.yml 文件中写入自动拼接的字符串对应的属性 tcp.ip 。

    tcp:
      ip: 10.0.90.92
    

    然后手写一个测试类:

    @RestController
    public class TestController {
    
        @Autowired
        private Node strUt;
    
        @GetMapping("test")
        public String test(){
    
            MessageData messageData = new MessageData();
            messageData.setContractName("contract");
            messageData.setChannelName("channel");
            messageData.setDbName("dbname");
            messageData.setKey("lishijian");
            messageData.setValue("SSSSSSSSSSSSSS");
    
            String str = this.strUt.send(JSON.toJSONString(messageData));
            return str;
        }
    }
    

    这样,一个简单的starter就写好了,只要理解了starter的原理,实现起来就很简单,第一点就是starter相当于一个依赖组,另一点就是starter可以完成初始化配置。

    end。

    相关文章

      网友评论

          本文标题:基于SpringBoot手写starter

          本文链接:https://www.haomeiwen.com/subject/zamjjltx.html