自研 Starter 组件/中间件开发

希望本文起到抛砖引玉的作用,比如开发黑/白名单校验组件、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 类编码如下:

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 配置类编码如下:

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,可以设置默认值,还可以设置有条件注入等,编码如下:

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 命令如下:

maven cleanmaven compile

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

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

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

{
  "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,内容如下:

# Auto Configureorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\cn.smart4j.extstarter.autoconfigure.StudentAutoconfigure

6. 打包发布

maven 打包命令如下:

maven package

7. 测试自定义 Starter

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

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

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

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

http://localhost:8080/student

返回结果:

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

# 精彩推荐 #

 Web安全头号大敌XSS漏洞解决最佳实践

 分布式系统「全链路日志追踪」实战之 RestTemplate & Feign

  小白都能看得懂的服务调用链路追踪设计与实现

​编辑  [三步法] 可视化分析定位线上 JVM 问题

​编辑  从 Java 代码如何运行聊到 JVM 和对象的创建-分配-定位-布局-垃圾回收

 "在看"吗,赶快分享和收藏吧

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值