我要配置mybatis二级缓存为redis
因为需要注入redis的ip port username等等
我需要构建JedisPoolConfig的bean,然后得到JedisConnectionFactory的bean
而我定义的redis缓存如下
final class MybatisCache implements Cache {
private String id
private final ReadWriteLock readWriteLock = new DummyReadWriteLock()
private RedisTemplate<String, Object> redisTemplate
private HashOperations<String, Object, Object> hashOperations
private static JedisConnectionFactory jedisConnectionFactory
static setJedisConnectionFactory(JedisConnectionFactory factory){
jedisConnectionFactory = factory
}
MybatisCache(String id) {
if (id == null) {
throw new IllegalArgumentException("Cache instances require an ID")
} else {
this.id = id
redisTemplate = new RedisTemplate()
redisTemplate.setConnectionFactory(jedisConnectionFactory)
redisTemplate.setKeySerializer(new StringRedisSerializer())
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer())
redisTemplate.setHashKeySerializer(new GenericJackson2JsonRedisSerializer())
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer())
redisTemplate.afterPropertiesSet()
hashOperations = redisTemplate.opsForHash()
}
。。。
}
但是MybatisCache不是spring的bean,所以如果这个类被加载时JedisPoolConfig,JedisConnectionFactory等bean还没有初始化的话,就得到null,有没有什么办法让JedisPoolConfig,JedisConnectionFactory等bean能保证在MybatisCache被使用期前初始化?
1、要么把你所谓的那些不被spring管理的类依赖于spring管理的bean,配置为Spring管理的Bean,这样你就可以用Spring的IOC注入了,这种方式更简单,理论上任何Bean,都可以被Spring管理。
2、如果你不想让Spring管理,那你在你代码里面,先把Spring初始化,这个应该好办的,初始化完成后,代码里可以监听Spring初始化完成的事件的,得到以后,你拿到Spring工厂,自己做IOC,做自己的类的初始化。