手写一个stater_教你手写一个spring-boot-starter组件

【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已成功注入到测试项目中。

你可能感兴趣的:(手写一个stater)