前言
springboot支持自定義starter,可以用來封裝一些自定義的組件,比如fastdfs,ftp等等工具類,封裝成starter之後,直接引入就可以了。
步驟
新建一個maven項目,在pom文件裏面引入相關依賴jar包。
主要需要引入spring-boot-configuration-processor
和spring-boot-autoconfigure
,這個引用是自動生成配置提示相關信息的,編譯之後就會自動生成spring-configuration-metadata.json文件,這樣就可以提示了。
<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>
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</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>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.13</version>
</dependency>
<dependency>
<groupId>com.taobao.dingding</groupId>
<artifactId>taobao-sdk-java-auto</artifactId>
<version>2020-06-20</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
以封裝釘釘發送消息爲例
DingdingAutoConfiguration 寫一個釘釘的自動封裝類,EnableConfigurationProperties
註解主要是使配置類生效,要是配置類不生效,後面具體業務的處理類就用不了相關屬性,這個配置不能使用在具體業務邏輯處理類上,不會生效。
@Configuration
@ConditionalOnClass({DingTalkClient.class})
@EnableConfigurationProperties({DingdingProperties.class})
public class DingdingAutoConfiguration {
@Bean
public DingDingTemplate dingTemplate() {
return new DingDingTemplate();
}
}
DingdingProperties 封裝一個釘釘相關屬性的配置類,這個需要使用@ConfigurationProperties
註解標記這是一個配置類,要不然不會被生成配置的提示信息。
@ConfigurationProperties(prefix = "xx.dingding")
public class DingdingProperties {
public String webHookUrl;
public String secret;
public String enable;
public String getEnable() {
return enable;
}
public void setEnable(String enable) {
this.enable = enable;
}
public String getSecret() {
return secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
public String getWebHookUrl() {
return webHookUrl;
}
public void setWebHookUrl(String webHookUrl) {
this.webHookUrl = webHookUrl;
}
}
寫具體的業務處理的bean,這個bean在自動配置的地方會被引用。
public class DingDingTemplate extends AbstractDingDingMsg {
private static final Logger logger = LoggerFactory.getLogger(DingDingTemplate.class);
public String sendMsgByText(OapiRobotSendRequest.Text text, OapiRobotSendRequest.At at) {
try {
DingTalkClient client = new DefaultDingTalkClient(signUrl());
OapiRobotSendRequest request = new OapiRobotSendRequest();
// 設置消息類型
request.setMsgtype("text");
// 設置@人
request.setAt(at);
// 設置文本
request.setText(text);
OapiRobotSendResponse response = client.execute(request);
return response.getBody();
} catch (Exception e) {
logger.error("發送釘釘消息失敗(文本格式):" + e.getMessage(), e);
}
return "";
}
public String sendMsgByMarkdown(OapiRobotSendRequest.Markdown markdown, OapiRobotSendRequest.At at) {
try {
DingTalkClient client = new DefaultDingTalkClient(signUrl());
OapiRobotSendRequest request = new OapiRobotSendRequest();
// 設置消息類型
request.setMsgtype("markdown");
// 設置@人
request.setAt(at);
// 設置文本
request.setMarkdown(markdown);
OapiRobotSendResponse response = client.execute(request);
return response.getBody();
} catch (Exception e) {
logger.error("發送釘釘消息失敗(markdown格式):" + e.getMessage(), e);
}
return "";
}
public String sendMsgByLink(OapiRobotSendRequest.Link link, OapiRobotSendRequest.At at) {
try {
DingTalkClient client = new DefaultDingTalkClient(signUrl());
OapiRobotSendRequest request = new OapiRobotSendRequest();
// 設置消息類型
request.setMsgtype("link");
// 設置@人
request.setAt(at);
// 設置文本
request.setLink(link);
OapiRobotSendResponse response = client.execute(request);
return response.getBody();
} catch (Exception e) {
logger.error("發送釘釘消息失敗(link格式):" + e.getMessage(), e);
}
return "";
}
新建一個spring.factories
在resources目錄下面新建一個META-INF文件夾,繼續新建一個spring.factories文件,裏面配置需要記載的自動配置類。前面的org.springframework.boot.autoconfigure.EnableAutoConfiguration
是官方提供的,後面的就是需要被自動加載的類。
###釘釘發送消息自定義starter###
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.xx.starter.dingding.config.DingdingAutoConfiguration
生成的jar包裏面就有spring-configuration-metadata.json文件
最後打成jar包就可以使用了。