个人学习SpringBoot常用小开源框架

如何定义自己的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

期待下一篇吧 ~~~

上一篇下一篇

猜你喜欢

热点阅读