前言
在公司的开发中, 我们经常会开发一些jar供其他业务小组使用, 在当前 spring
为主的开发环境下, 我们应该如何去包装一个jar让大家更加方便的使用呢?这里就涉及到sdk的开发, 比如kafka出品的 kafka-client
提供核心业务代码, 然后用 spring-kafka
包装 kafka-client
供 spring
更加方便的调用。这里我们模仿这种思路做一个简单的sdk开发流程介绍。
kafka-client的开发
我们通过构造方法简单的读取参数来模拟一个 kafka-client
, 能够将读取的变量打印出来即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
public class KafkaClient {
public KafkaClient(Properties properties) { this(propsToMap(properties)); }
KafkaClient(Map<String, Object> configs) { ClientConfig config = new ClientConfig(configs); }
private static Map<String, Object> propsToMap(Properties properties) { Map<String, Object> map = new HashMap(properties.size()); Iterator var2 = properties.entrySet().iterator();
while(var2.hasNext()) { Map.Entry<Object, Object> entry = (Map.Entry)var2.next(); if (!(entry.getKey() instanceof String)) { throw new RuntimeException(entry.getKey().toString() + entry.getValue() + "Key must be a string."); }
String k = (String)entry.getKey(); map.put(k, properties.get(k)); }
return map; } }
|
配置文件对象
1 2 3 4 5 6 7
| public class ClientConfig extends AbstractConfig{
public ClientConfig(Map<String, Object> props) { super(props, true); }
}
|
1 2 3 4 5 6 7 8 9 10 11 12
| public class AbstractConfig {
Logger logger = Logger.getLogger("AbstractConfig");
public AbstractConfig(Map<?, ?> originals, boolean doLog) { for (Map.Entry<?, ?> entry : originals.entrySet()) { if (doLog) { logger.info("读取到配置文件:[" + entry.getKey() + ":" + entry.getValue() + "]"); } } } }
|
然后我们测试下效果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class Test {
public static void main(String[] args) { Properties properties = new Properties(); properties.setProperty("name", "admin"); properties.setProperty("password", "123456"); new KafkaClient(properties); } }
|
由结果可见,我们的sdk已经可以正常使用, 将jar打包进我们的本地maven仓库, 接下来我们来包装spring-boot-adapter
kafka-spring-boot-starter开发
我们自定义的starter要遵守官方推荐的命名规范 xxx-spring-boot-starter
。
在我们使用开源社区提供的jar包时发现,好多变量在配置的时候是有提示补全功能的,这个我们也来实现下。
- 首先引入pom.xml依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.4.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <version>2.4.1</version> </dependency> <dependency> <groupId>cn.idea360</groupId> <artifactId>idea360-kafka-client</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
|
- 创建配置类
@ConfigurationProperties
注解即是配置变量补全的关键
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| @Configuration @ConfigurationProperties(prefix = "idea360.kafka") public class DemoProperties {
private String name; private String password;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; } }
|
- 将配置信息注入sdk的bean对象
kafka-client
中
1 2 3 4 5 6 7 8 9 10 11 12
| @Configuration @EnableConfigurationProperties(DemoProperties.class) public class DemoConfig {
@Bean public KafkaClient kafkaClient(DemoProperties demoProperties) { Properties properties = new Properties(); properties.setProperty("name", demoProperties.getName()); properties.setProperty("password", demoProperties.getPassword()); return new KafkaClient(properties); } }
|
- 按照spring的spi机制定义自启动类。 在
src/main/resources/META-INF/spring.factories
文件中定义
1
| org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.idea360.starter.DemoConfig
|
- 将我们包装好的starter打包进本地maven仓库
自定义starter测试
- 创建一个普通的spring-boot项目, pom.xml如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.idea360</groupId> <artifactId>idea360-kafka-spring-boot-demo</artifactId> <version>0.0.1</version> <name>dea360-kafka-spring-boot-demo</name> <description>Demo project for Spring Boot</description>
<properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.3.7.RELEASE</spring-boot.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.example</groupId> <artifactId>idea360-kafka-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.7.RELEASE</version> <configuration> <mainClass>cn.idea360.springdemo.SpringDemoApplication</mainClass> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
</project>
|
- 配置application.properties
1 2 3 4 5 6 7
| spring.application.name=idea360-kafka-spring-boot-demo
server.port=8080
idea360.kafka.name=admin idea360.kafka.password=123456
|
这里我们看到已经可以自动提示补全参数了
- 启动springboot项目, 控制台我们看到上边我们配置的参数已经被正确注入到了
kafka-client
中。
1 2
| 2021-01-03 13:10:53.402 INFO 13169 --- [ main] AbstractConfig : 读取到配置文件:[name:admin] 2021-01-03 13:10:53.402 INFO 13169 --- [ main] AbstractConfig : 读取到配置文件:[password:123456]
|
最后
本文到此结束,感谢阅读。如果您觉得不错,请关注公众号【当我遇上你】,您的支持是我写作的最大动力。