Springboot配置序列化方式不起作用
新建springboot模块,引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.1.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
配置redis
spring.redis.host=****
spring.redis.port=6379
spring.redis.password=redis
由于redis默认使用的是jdk的序列化方式,在redis里面存储的是键值识别性很差,需要修改,所以我们自定义序列化的方式
@Configuration
public class RedisSerializer {
@Bean
public RedisTemplate<Object,Object> setRedisTemlpate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<Object,Object> redisTemplate=new RedisTemplate<Object,Object>();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setStringSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
重新测试发现配置的序列化并没有起作用,想了一下,肯定是在自动配置的时候出了问题
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
public RedisAutoConfiguration() {
}
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
我们发现@ConditionalOnMissingBean(name = {"redisTemplate"})
这里做了判断的,如果spring容器里面存在就不执行下面的代码,由于自定义是我们方法名为setRedisTemlpate
,不是redisTemplate
,所以在自动配置的时候,发现容器里面没有,就会在下面代码中创建一个RedisTemplate,就导致了我们自定义的没有作用
把我们的方法名改为redisTemplate就可以了
@ConditionalOnBean:如果容器里面存在这个Bean,则执行
@ConditionalOnMissingBean:如果容器里面不存在这个Bean,则执行(自动配置常用)