springboot自定义starter(生成spring-configuration-metadata.json)可以提示写配置

前言

springboot支持自定义starter,可以用来封装一些自定义的组件,比如fastdfs,ftp等等工具类,封装成starter之后,直接引入就可以了。

步骤

新建一个maven项目,在pom文件里面引入相关依赖jar包。
主要需要引入spring-boot-configuration-processorspring-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包就可以使用了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章