我们在IDEA中创建redis对象一般是使用RedisTemplate类的opsForxxx()方法创建一个redis对象,然后存储数据.
public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {
private boolean enableTransactionSupport = false;
private boolean exposeConnection = false;
private boolean initialized = false;
private boolean enableDefaultSerializer = true;
public void afterPropertiesSet() {
super.afterPropertiesSet();
boolean defaultUsed = false;
if (this.defaultSerializer == null) {
this.defaultSerializer = new JdkSerializationRedisSerializer(this.classLoader != null ? this.classLoader : this.getClass().getClassLoader());
}
if (this.enableDefaultSerializer) {
if (this.keySerializer == null) {
this.keySerializer = this.defaultSerializer;
defaultUsed = true;
}
if (this.valueSerializer == null) {
this.valueSerializer = this.defaultSerializer;
defaultUsed = true;
}
if (this.hashKeySerializer == null) {
this.hashKeySerializer = this.defaultSerializer;
defaultUsed = true;
}
if (this.hashValueSerializer == null) {
this.hashValueSerializer = this.defaultSerializer;
defaultUsed = true;
}
}
}
如上述代码所示,如果你在使用RedisTemplate生成的对象时没有指定key,value的序列化方式,它会自动使用jdk序列化方式序列化redis存入的key和value.
然后说下他什么时候执行的序列化
由上述代码可以看到RedisTemplate继承了RedisAccessor
public class RedisAccessor implements InitializingBean {
protected final Log logger = LogFactory.getLog(this.getClass());
@Nullable
private RedisConnectionFactory connectionFactory;
public RedisAccessor() {
}
public void afterPropertiesSet() {
Assert.state(this.getConnectionFactory() != null, "RedisConnectionFactory is required");
}
}
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
InitializingBean接口有个,afterPropertiesSet()方法这个方法的意思是初始化bean的时候执行
RedisAccessor 实现了InitializingBean接口,实现了afterPropertiesSet()方法,RedisTemplate又继承了RedisAccessor ,重写了afterPropertiesSet()方法,且序列化的配置都在这个方法中,意味着,在将RedisTemplate对象交给SpringIOC容器管理的时候就有了默认的jdk序列化能力,如果要自定义设置序列化方式,就需要创建一个配置类,然后创建一个RedisTemplate对象,然后设置自定义的key,value的序列方式, 和连接工厂对象, 最后把对象方到SpringIOC容器中,这样以后使用RedisTemplate创建redis对象时就是用的自定义的序列化方式.
@Configuration
public class RedisConfiguration {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate();
//设置redis key的序列化对象
template.setKeySerializer(new StringRedisSerializer());
//设置redis连接工厂对象
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}