问题
前一阵子为公司写了一个基于jedis的redis工具类,出发点有几个:
- spring-data-redis提供的api还是比较复杂,方法名也跟redis的命令区别较大,很多人不太会用
- jedis虽然api不算复杂,但没有提供一些比较高级的方法,比如操作集群时,不能用管道操作
- 众所周知,获取keys和del大键,是新人很容易犯的错误,有必要提供封装的方法避免这两个坑
有一就有二,既然写了这个工具类,那么就自然而然地想再写个配套的starter,因为公司最近都用Spring Boot了,搞个starter显然会比较简单,B格也高。
步骤
步骤其实比较简单,主要涉及几个东西:
自动配置类
首先需要一个自动配置类,它负责完成配置(创建bean)的工作,大概长这样:
@Configuration
@ConditionalOnClass(RedisUtils.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {
@Autowired
private RedisProperties redisProperties;
@Bean
public RedisUtils redisUtils() {
RedisUtils redisUtils;
// 从RedisProperties对象中获取配置参数
// 完成RedisUtils的实例化,具体略
return redisUtils;
}
}
几点说明:
- @Configuration注解:表明这是一个配置类
- @ConditionalOnClass注解:表明只有当发现classpath里有RedisUtils这个类时才需要加入本配置类
- @EnableConfigurationProperties注解:指定了一个配置参数类
上面提到了一个配置参数类,那么看下这个类怎么写。
配置参数类
@Data
@ConfigurationProperties(prefix = "redis")
public class RedisProperties {
private String host;
private Integer port;
private String password;
private Integer database;
private String sentinelNodes;
private String clusterNodes;
private String master;
private Integer poolMaxActive;
private Integer poolMaxIdle;
private Integer poolMaxWait;
private Integer poolMinIdle;
}
这个类比较简单,就是通过@ConfigurationProperties注解表明这是一个配置参数类,而且读的是所有以redis前缀开始的配置参数。@Data是lombok的注解,简化编码的,与本文没有直接关系。
有了这个类以后,只要我们在配置文件(默认为application.properties)里这样写:
redis.host=localhost
redis.port=6379
redis.password=momo
redis.database=5
对应的参数就可以被读进来,set到RedisProperties实例里,然后传递给上面的自动配置类。
参考资料:Spring Boot的RedisProperties文件
spring.factories文件
有了以上两个类,还不够,还需要一个spring.factories文件,内容这样写:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.alfredzhang.spring.boot.redis.RedisAutoConfiguration
把这个文件放到resource/META-INF目录下。
Spring Boot启动时,会从这个文件里找出所有自动配置类并进行处理。
参考资料:Spring Boot的spring.factories文件
starter
starter本身可以仅仅包含一个pom文件,不含任意java文件。我为了简化,把自动配置类跟starter放到了一起。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.alfredzhang.spring.boot</groupId>
<artifactId>redis-spring-boot-starter</artifactId>
<version>1.0.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<redis-utils.version>1.0.0</redis-utils.version>
<spring-boot.version>1.5.8.RELEASE</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>com.alfredzhang.utils</groupId>
<artifactId>redis-utils</artifactId>
<version>${redis-utils.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
pom里依赖了spring-boot-autoconfigure,以及这个starter的服务对象:redis-utils组件。
使用
使用比较简单。
添加依赖
在pom中添加依赖。
<dependency>
<groupId>com.alfredzhang.spring.boot</groupId>
<artifactId>redis-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
自动装配
在需要使用的地方装配下,就可以用了。
@Autowired
private RedisUtils redisUtils;