Spring Boot 手写一个 Starter

对于自动装配的原理进行分析之后,我们可以基于这个机制来实现一个Starter组件,以便于加深大家对自动装配及Starter组件的理解。同时,Spring Boot 官方提供的 Starter 并不能囊括所有的技术组件,在工作中,如果自己的项目需要支持 Spring Boot ,也需要开发Starter组件。

Spring Boot 官方提供的 Starter 的作用来看,Starter组件主要包括三个功能:

  • 涉及相关组件的Jar包依赖
  • 自动实现Bean的装配
  • 自动声明并且加载application.properties文件中的配置

下面我们来先了解一下 Starter 组件的命名规范

Starter 的命名规范

Starter 的命名主要分为两类,一类是官方命名,另一类是自定义组件命名,这种命名格式并不是强制性的,也是一种约定俗成的方式,可以让开发者更容易识别

  • 官方命名的格式为:spring-boot-starter-模块名称,比如 spring-boot-starter-web
  • 自定义命名格式:模块名称-spring-boot-starter,比如 mybatis-spring-boot-starter

简单来说,官方命名中模块名放在最后,而自定义组件中模块名放在最前面

实现基于 Redis 的 Starter

1、添加依赖

<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>3.13.0</version>
</dependency>

2、定义属性类

/**
 * redis配置信息
 * @author itwolf
 * @date 2022/03/05 10:00
 */
@Data
@Component
@ConfigurationProperties(prefix = "redisson")
public class RedissonProperties {


    private String host;

    private int port;

    private String password;

    private int database;

    private int connectTimeout;

    private int connectionPoolSize;

    private int connectionMinimumIdleSize;


    private String[] clusterNodes;

    private int pingConnectionInterval = 1000;
}

@ConfigurationProperties(prefix = "redisson")

这个redission配置在nacos的yaml文件

3、定义需要自动装配的配置类

Redission支持集群,主从,哨兵等模式的配置,有兴趣的话,可以基于nacos配置,建议使用config.fromYAML方式,直接加载配置完成不同模式的初始化

package server.config;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.codec.JsonJacksonCodec;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;

/**
 * redis配置
 * @author itwolf
 * @since 2022/03/05 10:00
 */
@Slf4j
@Configuration
public class RedissonConfig {

    @Resource
    private RedissonProperties redissonProperties;

    @Bean(destroyMethod = "shutdown")
    public RedissonClient redissonClient() {

        Config config = new Config();
        config.setCodec(new JsonJacksonCodec());

        String host = redissonProperties.getHost();
        if (StringUtils.isBlank(host)) {
            throw new IllegalArgumentException("redis connect error, no config redis host.");
        }

        String[] nodes = StringUtils.split(host, ",");
        if (nodes.length == 1) {
            String address = "redis://" + redissonProperties.getHost();
            log.info("Redis Single Mode, user address: {}, pingConnectionInterval", address, redissonProperties.getPingConnectionInterval());
            config.useSingleServer().setAddress(address)
                    .setPassword(redissonProperties.getPassword())
                    .setConnectionPoolSize(redissonProperties.getConnectionPoolSize())
                    .setConnectionMinimumIdleSize(redissonProperties.getConnectionMinimumIdleSize())
                    .setConnectTimeout(redissonProperties.getConnectTimeout())
                    .setPingConnectionInterval(redissonProperties.getPingConnectionInterval());

        } else {
            int len = nodes.length;
            String[] clusterNodes = new String[nodes.length];
            for (int i = 0; i < len; i++) {
                clusterNodes[i] = "redis://" + nodes[i];
            }
            log.info("redis cluster mode, user address: {}", StringUtils.join(clusterNodes, ","));
            config.useClusterServers()
                    .setConnectTimeout(redissonProperties.getConnectTimeout())
                    .setMasterConnectionPoolSize(redissonProperties.getConnectionPoolSize())
                    .setMasterConnectionMinimumIdleSize(redissonProperties.getConnectionMinimumIdleSize())
                    .addNodeAddress(clusterNodes)
                    .setPassword(redissonProperties.getPassword())
                    .setPingConnectionInterval(redissonProperties.getPingConnectionInterval());
        }

        return Redisson.create(config);
    }

}

4、在 resouces 下创建 META-INF/spring.factories文件,使得Spring Boot 程序可以扫描到该文件完成自动装配,key和value对应如下

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.user.RedissonConfig

5、最后一步,使用阶段做两个步骤,添加 Starter 依赖、设置属性配置

<dependency>
	<groupId>com.user.book</groupId>
	<artifactId>redis-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

application.properties文件 配置 host 和 port

itwolf.redission.host=localhost

itwolf.redis.port=6379

这个properties可以修改yaml文件的nacos配置,后面会讲到关于nacos服务注册与发现

先看看这个nacos的配置,预先了解nacos配置中心

在nacos配置中心创建

yaml文件

redisson:
  host: 127.0.0.1:6379
  password: 123456
  timeout: 1000
  connectionPoolSize: 300
  connectionMinimumIdleSize: 50
  connectTimeout: 1000

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明雨星云

感谢,我会继续创作更优质作品

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值