以写redissonstarter为例,去操作redis客户端的数据。
第一步:创建一个maven项目,artifactId命名为redisson-spring-boot-starter。
1).starter命名规范:redisson是我们自定义的,后面-spring-boot-starter是固定命名。
第二步:引入这些依赖:redisson 、spring-boot-starter、spring-boot-configuration-processor
1).<optional>true</optional>这个标签的作用:当别人通过pom依赖这个项目的时候,这个不会被传递依赖进来,当你依赖某各工程很庞大或很可能与其他工程的jar包冲突的时候建议加上optional标签设置为true,可以节省开销,同时减少依赖冲突。
2).spring-boot-configuration-processor依赖的作用:spring默认使用yml中的配置,但有时候要用传统的xml或properties配置,就需要使用spring-boot-configuration-processor了
<dependencies>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.15.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.7</version>
<optional>true</optional>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.1.7.RELEASE</version>
<optional>true</optional>
</dependency>
</dependencies>
第三步:创建RedissonProperties 和RedissonAutoConfiguration类;增加META-INF文件夹,下面增加spring.factories
1).@ConfigurationProperties(prefix = "wcx.redisson")
@ConfigurationProperties注解默认读取主配置文件,springboot中主配置文件是application.properties和application.yml。
这样当我们starter创建好,被别人依赖的时候,别人就可以在application.yml配置相关属性被我们读取啦。
@ConfigurationProperties(prefix = "wcx.redisson")
public class RedissonProperties {
private String post="localhost";
private String port="6379";
private int timeout=5000;
private boolean ssl=false;
public String getPost() { return post; }
public void setPost(String post) { this.post = post; }
public String getPort() { return port; }
public void setPort(String port) { this.port = port; }
public int getTimeout() { return timeout; }
public void setTimeout(int timeout) { this.timeout = timeout; }
public boolean isSsl() { return ssl; }
public void setSsl(boolean ssl) { this.ssl = ssl; }
}
2).@EnableConfigurationProperties(RedissonProperties.class)
如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component,那么在IOC容器中是获取不到properties 配置文件转化的bean
@EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入。
如果@ConfigurationProperties是在第三方包中,那么@component是不能注入到容器的。只有@EnableConfigurationProperties才可以注入到容器。
@Configuration
@EnableConfigurationProperties(RedissonProperties.class)
public class RedissonAutoConfiguration {
@Bean
public RedissonClient getRedissonClient(RedissonProperties redissonProperties){
Config config=new Config();
String prefix="redis://";
if(redissonProperties.isSsl()){
prefix="rediss://";
}
config.useSingleServer()
.setAddress(prefix+redissonProperties.getPost()+":"+redissonProperties.getPort())
.setTimeout(redissonProperties.getTimeout());
return Redisson.create(config);
}
}
3).spring.factories里面配置我们的RedissonAutoConfiguration类
spring.factories作用:别人依赖我们的starter项目的时候,可以把spring.factories里配置将这些值导入容器。
ps:这里是不是很像springboot的自动装配原理,以及applicaion.yml和spring.factories联系是什么呢?
springboot自动装配xxAutoConfiguration,从xxProperties取默认值,想修改,就在applicaion.yml配置文件去配。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.wcx.config.RedissonAutoConfiguration
4).增加提示:配置文件配置的时候会有提示说明,这个配置项的解释,如下图。
META-INF文件夹下增加additional-spring-configuration-metadata.json文件
{
"properties": [
{
"name": "wcx.redisson.port",
"type": "java.lang.String",
"sourceType": "com.wcx.config.RedissonProperties",
"defaultValue": "6379",
"description": "端口"
},
{
"name": "wcx.redisson.post",
"type": "java.lang.String",
"sourceType": "com.wcx.config.RedissonProperties",
"defaultValue": "localhost",
"description": "ip"
}
]
}
第四步:maven打包:install(把项目打包并尝试着运行一次,打包后的资源文件在项目的target 文件夹下面, 然后把打好的包安装到maven 本地仓库,可以提供给其它项目进行依赖)
第五步:测试:
1).创建测试项目,直接创建springboot项目,引入spring-boot-starter-web依赖和我们的redisson-spring-boot-starter依赖。
ps:普通项目和web项目区别:wen项目可以一直启动,普通启动完就直接完了~~
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.wcx</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2).写一个接口测试,返回key的数量。
@RestController
public class RedissonTestController {
@Autowired
private RedissonClient redissonClient;
@RequestMapping("/hello")
public String hello(){
return ""+redissonClient.getKeys().count();
}
}
3).启动Redis服务端和客户端,往里面set一些值。
4).请求我们的测试接口,返回key的数量。成功!