自研 Starter 组件/中间件开发

Posted IT技术小咖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自研 Starter 组件/中间件开发相关的知识,希望对你有一定的参考价值。


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

本文目录结构
自研 Starter 组件/中间件开发

1. 创建 SpringBoot 工程

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

自研 Starter 组件/中间件开发
自研 Starter 组件/中间件开发

2. 引入 spring-boot-starter、spring-boot-configure 及相应的第三方 jar 依赖
pom 文件如下:
自研 Starter 组件/中间件开发

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


自研 Starter 组件/中间件开发

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 工程的目录结构如下:

自研 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 clean maven compile

重新编译项目后,配置元信息文件如下:
target/classes/META-INF/spring-configuration-metadata.json

自研 Starter 组件/中间件开发

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 Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ cn.smart4j.extstarter.autoconfigure.StudentAutoconfigure

6. 打包发布
maven 打包命令如下:
  
    
    
  
maven package

自研 Starter 组件/中间件开发

7. 测试自定义 Starter

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

自研 Starter 组件/中间件开发

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

自研 Starter 组件/中间件开发

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

自研 Starter 组件/中间件开发

启动测试工程,通过浏览器发送 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


自研 Starter 组件/中间件开发



精彩推荐 #

 

 

  




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

以上是关于自研 Starter 组件/中间件开发的主要内容,如果未能解决你的问题,请参考以下文章

微服务从代码到k8s部署应有尽有系列全集

spring boot自定义starter

微服务从代码到k8s部署应有尽有系列(十一日志收集)

使用Spring Boot Starter开发RocketMQ

微服务从代码到k8s部署应有尽有大结局(k8s部署)

开发一个属于自己的Spring Boot Starter