springboot 可自动注入,redis的模板对象,RedisTemplate。
接下来我们看下项目自动注入模板对象的内容
idea -> crtl + N -> 检索 RedisAutoConfiguration,查看RedisTemplate 的源码
@Configuration
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
public RedisAutoConfiguration() {
}
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
说明:
@ConditionalOnBean // 当给定的在bean存在时,则实例化当前Bean
@ConditionalOnMissingBean // 当给定的在bean不存在时,则实例化当前Bean
@ConditionalOnClass // 当给定的类名在类路径上存在,则实例化当前Bean
@ConditionalOnMissingClass // 当给定的类名在类路径上不存在,则实例化当前Bean
@ConditionalOnMissingBean(name = {“redisTemplate”}):
当项目中不存在名字为 redisTemplate 的对象时,系统默认的模板对象才会生成,如果有自定义名称为redisTemplate 的对象时,系统默认提供的对象不生成
由上可知,redis 自动导入时,泛型只能有两种
1:RedisTemplate<Object, Object>
2:StringRedisTemplate extends RedisTemplate<String, String>
如果项目中使用的泛型不是这两种,可以在导入的时候不指明泛型,否则自动导入会报错
错误示例:
@Autowired
private RedisTemplate<String,Object> redisTemplate;
报错:
修正:不指明泛型即可
@Autowired
private RedisTemplate redisTemplate;