前言
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包就可以使用了。