如何定义自己的SpringBoot Starter?
2020-07-06 本文已影响0人
逗逼程序员
熟悉我文章逻辑的 应该知道,我们先不求甚解,先动手写自己的 Starter 再去仔细研究其中的实现逻辑。
我们选了一个比较由代表性的例子,短信发送---这个功能在大多数互联网公司都是存在的,所以很切合实际 的一个例子。废话不说,先撸码:
1.png这个就是我们的工程目录结构,下面我们挨个来分析下
1、首先当然是pom 文件
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.demo</groupId>
<artifactId>msg-spring-boot-starter</artifactId>
<version>0.0.1.RELEASE</version>
<name>msg-spring-boot-starter</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
加入了 parent 是为了统一管理 依赖版本号,你也可以不用 parent,写死下面的依赖版本号,也没毛病。
2、接下来 当然 定义你的配置信息 MsgProperties.class
@ConfigurationProperties(prefix = "msg")
public class MsgProperties {
private String url;
private String accesskeyId;
private String accessKeySecret;
//...省略 get set
}
这里定义 客户方使用 时候需要配置的一些参数,可以有默认值
3、定义一个功能服务类 MsgService.class
public class MsgService {
private String url;
private String accessKeyId;
private String accessKeySecret;
public MsgService(String url, String accessKeyId, String accessKeySecret) {
this.url = url;
this.accessKeyId = accessKeyId;
this.accessKeySecret = accessKeySecret;
}
public int sendMsg(String msg) {
//实现自己发送业务逻辑
return HttpClientUtils.sendMsg(url, accessKeyId, accessKeySecret, msg);
}
}
该类实现你自己的模块的主要功能,比如根据配置的参数实现发送的逻辑,这里是调用的一个公共 HttpClientUtils 发送类。
4、接下来就是重点了,也是 starter 的主要配置类:MsgAutoConfiguration
@Configuration
@EnableConfigurationProperties({ MsgProperties.class })
@ConditionalOnProperty(prefix = "msg", value = "enabled", havingValue = "true")
public class MsgAutoConfiguration {
@Autowired
private MsgProperties msgProperties;
@Bean
@ConditionalOnMissingBean
public MsgService msgService() {
MsgService msgService = new MsgService(msgProperties.getUrl(), msgProperties.getAccesskeyId(),
msgProperties.getAccessKeySecret());
return msgService;
}
}
类似 , 我们使用 cache 框架中的,redisTemplate、stringRedisTemplate
5、灰常重要的配置文件,(为什么重要?请参见下一篇原理分析篇~~~~~~)spring.factories
#-------starter自动装配---------
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.demo.starter.config.MsgAutoConfiguration
OK , 主要配置,都搞完了,接下来就是使用的问题了。
新建一个 web demo 项目,并加入依赖:
<dependency>
<groupId>com.demo</groupId>
<artifactId>msg-spring-boot-starter</artifactId>
<version>0.0.1.RELEASE</version>
</dependency>
调用定义好的 服务:
@RestController
public class MsgController {
@Autowired
private MsgService msgService;
@GetMapping("/send")
public void send() {
msgService.sendMsg("hello");
}
}
配置信息:
msg.access-key-secret=111111
msg.accesskey-id=11111
msg.url=localhost:8080/send
msg.enabled=true
备注:刚开始的时候,没有添加 msg.enabled=true 这个配置,搞得项目起不来,一脸懵逼 。
OK ,搞定,轻松调用 实现的 starter 发送服务。
项目地址:https://github.com/shihongwei/sms-spring-boot-starter