美文网首页
基于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