MyBatis RedisCache 的项目地址
http://mybatis.org/redis-cache/
https://github.com/mybatis/redis-cache
这是MyBatis官方的二级缓存的Redis实现, 因为其依赖于Jedis和固定的redis.properties, 和Spring Boot集成较为麻烦, 在Spring Boot 2.1.x中使用还会报RedisConfig初始化错误.
实际项目使用中, 经过一些修改使其能正常使用, 记录如下
使其正常运行
首先不要用pom的jar包引入, 直接到github项目地址上下载源代码, 需要的只是 src/main/java/org/mybatis/caches/redis/ 目录下的文件, 将其放到自己的项目里.
其次, 现在的源码中, 对redis.properties要求其中各项配置名称要以redis.为前缀, 和jar包引用时的要求不一样.
这样基本就能启动运行了
集成到Spring Boot的配置
如果不希望单独做一个redis.properties的配置文件, 可以在现有的配置文件中加上一个静态引用, 例如
@Component @ConfigurationProperties("yourconfigprefix") public class SysConfig { private static SysConfig f; private int developmentMode; private String buildTimestamp; private RedisConfig redisCache; private RedisConfig redisLock; private RedisConfig redisMybatis; @PostConstruct public void initialize() { f = this; } public static SysConfig getInstance() { return f; } public int getDevelopmentMode() { return developmentMode; } public void setDevelopmentMode(int developmentMode) { this.developmentMode = developmentMode; } public String getBuildTimestamp() { return buildTimestamp; } public void setBuildTimestamp(String buildTimestamp) { this.buildTimestamp = buildTimestamp; } public RedisConfig getRedisCache() { return redisCache; } public void setRedisCache(RedisConfig redisCache) { this.redisCache = redisCache; } public RedisConfig getRedisLock() { return redisLock; } public void setRedisLock(RedisConfig redisLock) { this.redisLock = redisLock; } public RedisConfig getRedisMybatis() { return redisMybatis; } public void setRedisMybatis(RedisConfig redisMybatis) { this.redisMybatis = redisMybatis; } public static class RedisConfig { private String host; private int port; private String password; private int database; public String getHost() { return host; } public void setHost(String host) { this.host = host; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getDatabase() { return database; } public void setDatabase(int database) { this.database = database; } } }
然后, 就可以在RedisCache.java中, 静态引用SysConfig了, 将其中初始化那一步修改为
public RedisCache(final String id) { if (id == null) { throw new IllegalArgumentException("Cache instances require an ID"); } this.id = id; redisConfig = new RedisConfig(); redisConfig.setHost(SysConfig.getInstance().getRedisMybatis().getHost()); redisConfig.setPort(SysConfig.getInstance().getRedisMybatis().getPort()); redisConfig.setPassword(SysConfig.getInstance().getRedisMybatis().getPassword()); redisConfig.setDatabase(SysConfig.getInstance().getRedisMybatis().getDatabase()); pool = new JedisPool(redisConfig, redisConfig.getHost(), redisConfig.getPort(), redisConfig.getConnectionTimeout(), redisConfig.getSoTimeout(), redisConfig.getPassword(), redisConfig.getDatabase(), redisConfig.getClientName(), redisConfig.isSsl(), redisConfig.getSslSocketFactory(), redisConfig.getSslParameters(), redisConfig.getHostnameVerifier()); }
.因为ConfigurationProperties的初始化在mapper之前, 这样就可以在mapper初始化的时候拿到已经赋值的配置信息, 完成mapper对应的RedisCache实例的初始化.