对于自动装配的原理进行分析之后,我们可以基于这个机制来实现一个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