前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自研 Starter 组件/中间件开发

自研 Starter 组件/中间件开发

作者头像
IT技术小咖
发布2021-04-23 11:13:32
5390
发布2021-04-23 11:13:32
举报
文章被收录于专栏:码上修行码上修行

希望本文起到抛砖引玉的作用,比如开发黑/白名单校验组件、kafka日志组件、ORM组件、工具类组件、配置中心组件等等,可以参考 spring boot 官方的 starter 组件示例进行自研自己的 Starter。

本文目录结构

1. 创建 SpringBoot 工程

通过 IDEA 或 https://start.spring.io/ 快速创建 SpringBoot 工程

2. 引入 spring-boot-starter、spring-boot-configure 及相应的第三方 jar 依赖

pom 文件如下:

这里引入的第三方 jar ,是一个简单的 springboot 工程,结构如下,只包含一个 Student 类,其中引入的第三方 jar 可以是自定义的 jar 或是其他的第三方 jar,如 jdbc、redis、kafka 等等。

Student 类编码如下:

代码语言:javascript
复制
package cn.smart4j.extjar.entity;

/**
 * @program: ext-starter
 *
 * @description: 
 *
 * @author: Mr.Zhang
 *
 * @create: 2021-04-11 12:05
**/
public class Student {
    /**
     * 姓名
     */
    private String name;
    /**
     * 学号
     */
    private String sno;
    /**
     * 性别
     */
    private String sex;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 身高
     */
    private Integer high;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getHigh() {
        return high;
    }

    public void setHigh(Integer high) {
        this.high = high;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sno='" + sno + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", high=" + high +
                '}';
    }
}

自研 starter 工程的目录结构如下:

3. 创建自动配置类

StudentProperties 配置类编码如下:

代码语言:javascript
复制
package cn.smart4j.extstarter.autoconfigure;

import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * @program: ext-starter
 *
 * @description: 
 *
 * @author: Mr.Zhang
 *
 * @create: 2021-04-11 12:15
**/
@ConfigurationProperties(prefix = "cn.smart4j")
public class StudentProperties {
    /**
     * 姓名
     */
    private String name;
    /**
     * 学号
     */
    private String sno;
    /**
     * 性别
     */
    private String sex;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 身高
     */
    private Integer high;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getHigh() {
        return high;
    }

    public void setHigh(Integer high) {
        this.high = high;
    }

    @Override
    public String toString() {
        return "StudentProperties{" +
                "name='" + name + '\'' +
                ", sno='" + sno + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", high=" + high +
                '}';
    }
}

StudentAutoconfigure 自动配置类中返回需要的 Bean,可以设置默认值,还可以设置有条件注入等,编码如下:

代码语言:javascript
复制
package cn.smart4j.extstarter.autoconfigure;


import cn.smart4j.extjar.entity.Student;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @program: ext-starter
 *
 * @description: 
 *
 * @author: Mr.Zhang
 *
 * @create: 2021-04-11 12:17
**/
@Configuration
@EnableConfigurationProperties(StudentProperties.class)
public class StudentAutoconfigure {

    @Bean
    public Student getStudent(StudentProperties sp) {
        Student stu = new Student();
        stu.setName(sp.getName());
        stu.setSno(sp.getSno());
        stu.setSex(sp.getSex());
        stu.setAge(sp.getAge());
        stu.setHigh(sp.getHigh());
        return stu;
    }
}

4. 生成配置元信息

引入 spring-boot-configuration-processor 依赖

maven 命令如下:

代码语言:javascript
复制
maven clean
maven compile

重新编译项目后,配置元信息文件如下:

target/classes/META-INF/spring-configuration-metadata.json

spring-configuration-metadata.json 内容如下:

代码语言:javascript
复制
{
  "groups": [
    {
      "name": "cn.smart4j",
      "type": "cn.smart4j.extstarter.autoconfigure.StudentProperties",
      "sourceType": "cn.smart4j.extstarter.autoconfigure.StudentProperties"
    }
  ],
  "properties": [
    {
      "name": "cn.smart4j.age",
      "type": "java.lang.Integer",
      "description": "年龄",
      "sourceType": "cn.smart4j.extstarter.autoconfigure.StudentProperties"
    },
    {
      "name": "cn.smart4j.high",
      "type": "java.lang.Integer",
      "description": "身高",
      "sourceType": "cn.smart4j.extstarter.autoconfigure.StudentProperties"
    },
    {
      "name": "cn.smart4j.name",
      "type": "java.lang.String",
      "description": "姓名",
      "sourceType": "cn.smart4j.extstarter.autoconfigure.StudentProperties"
    },
    {
      "name": "cn.smart4j.sex",
      "type": "java.lang.String",
      "description": "性别",
      "sourceType": "cn.smart4j.extstarter.autoconfigure.StudentProperties"
    },
    {
      "name": "cn.smart4j.sno",
      "type": "java.lang.String",
      "description": "学号",
      "sourceType": "cn.smart4j.extstarter.autoconfigure.StudentProperties"
    }
  ],
  "hints": []
}

5. 创建发现配置文件

在 resource 文件夹下创建对应目录和文件:META-INF/spring.factories,内容如下:

代码语言:javascript
复制
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.smart4j.extstarter.autoconfigure.StudentAutoconfigure

6. 打包发布

maven 打包命令如下:

代码语言:javascript
复制
maven package

7. 测试自定义 Starter

创建测试 ext-spring-boot-starter 的 SpringBoot 工程:ext-test,如下:

pom 文件引入自研 starter,修改如下:

新增测试 Controller 类,编码如下:

启动测试工程,通过浏览器发送 GET 请求:

http://localhost:8080/student

返回结果:

代码语言:javascript
复制
Student{name='张三', sno='100001', sex='1', age=18, high=180}

说明 Student 类注入成功,并完成方法调用。

8. 小结

自研 Spring Boot Starter 组件/中间件的一般步骤:

  • 创建 Spring Boot 工程
  • 引入相关依赖 jar
  • 创建自动配置类
  • 生成配置元信息 json 文件
  • 创建spring.factories文件
  • 打包发布
  • 测试自研的 xxx-spring-boot-starter

#

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上修行 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档