【springboot】手写spring-boot-starter组件
前言
starter会把所有用到的依赖包都包含进来,避免开发者自己去引入依赖所带来的麻烦。
虽然不同的starter实现起来各有差异,但是他们基本上都会使用到两个相同的内容:ConfigurationProperties和AutoConfiguration。
Starter是一组可以让你很方便的在应用增加的依赖关系描述符的集合。或者可以这样理解,平时我们开发的时候很多情况下都会有一个模块依赖另一个模块,这个时候我们一般都是采用maven的模块依赖,进行模块的依赖,但是这种情况下我们完全可以采用Starter的方式,将需要被依赖的模块用Starter的方式去开发,最后直接引入一个Starter也可以达到这样的效果。
命名规则
由于SpringBoot官方本身就提供了很多Starter,为了区别那些是官方的,哪些是第三方的,所以SpringBoot官方提出:
第三方提供的Starter统一用xxx-spring-boot-starter
而官方提供的Starter统一用spring-boot-starter-xxx。
需求
下边我们将以Redisson为例,实现一个简易版的starter组件,通过starter组件将RedissonClient所需的jar和bean依赖到我们当前项目。
项目结构
创建Starter
首先我们创建一个redisson-spring-boot-starter的项目,并添加redisson依赖和spring-boot-starter依赖,如下
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.autu.example.redisson
redisson-spring-boot-starter
1.0-SNAPSHOT
redisson-spring-boot-starter
http://www.example.com
org.springframework.boot
spring-boot-starter
2.3.1.RELEASE
true
org.redisson
redisson
3.13.1
org.springframework.boot
spring-boot-configuration-processor
2.3.1.RELEASE
复制代码
编写配置类
创建一个ConfigurationProperties用于保存配置信息
@ConfigurationProperties(prefix = "auto.redisson")
public class RedissonProperties {
/** Redis server host */
private String host = "localhost";
/** Redis server port */
private int port = 6379;
/** 连接超时时间 */
private int timeout;
/** 是否启用ssl支持 */
private boolean ssl;
...
}
复制代码
创建自动化配置类
创建一个AutoConfiguration,引用定义好的配置信息
在AutoConfiguration中实现bean的注入以及配置信息的读取
把这个类加入spring.factories配置文件中进行声明
@ConditionalOnClass(Redisson.class)
@EnableConfigurationProperties(RedissonProperties.class)
@Configuration
public class RedissonAutoConfiguration {
@Bean
RedissonClient redissonClient(RedissonProperties redissonProperties) {
Config config = new Config();
// 判断是否启用ssl
String prefix = redissonProperties.isSsl() ? "rediss://" : "redis://";
String host = redissonProperties.getHost();
int port = redissonProperties.getPort();
config.useSingleServer()
.setAddress(prefix + host + ":" + port)
.setConnectTimeout(1000 * 30);
return Redisson.create(config);
}
}
复制代码
创建spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.autu.example.redisson.RedissonAutoConfiguration
复制代码
创建additional-spring-configuration-metadata.json
additional-spring-configuration-metadata.json的作用:描述配置信息,在其他项目依赖当前starter组件时起到提示的作用。
org.springframework.boot
spring-boot-configuration-processor
2.3.1.RELEASE
复制代码{
"properties": [
{
"name": "autu.redissin.host",
"type": "java.lang.String",
"description": "redis服务器地址.",
"defaultValue": "localhost"
},{
"name": "autu.redisson.port",
"type": "java.lang.Integer",
"description": "redis服务器端口.",
"defaultValue": 6379
}
]
}
复制代码
接下来,我们通过运行mvn install命令,将这个项目打成jar包部署到本地仓库,提供给另一个服务调用。
测试
创建一个测试项目,依赖redisson-spring-boot-starter 。
application.properties配置文件
auto.redisson.host=127.0.0.1
auto.redisson.port=6379
auto.redisson.timeout=10000
auto.redisson.ssl=false
复制代码
测试类
@RestController
public class HelloController {
@Autowired
RedissonClient redissonClient;
@GetMapping("/test")
public String say() {
RBucket bucket = redissonClient.getBucket("name");
if (bucket.get() == null) {
bucket.set("bucket");
}
return bucket.get().toString();
}
}
复制代码
测试结果
从结果中,我们看到starter中定义的RedissonClient已成功注入到测试项目中。