spring引用RedisTemplate两次就创建2个连接吗?

@Autowired
RedisTemplate redisTemplate;

@Autowired
RedisTemplate<String, String> redisTemplateString2String;

这样使用是创建1个连接还是2个啊?

@Autowired
RedisTemplate redisTemplate;

@Autowired
RedisTemplate<String, String> redisTemplateString2String;

这样使用是创建1个连接还是2个啊?

阅读 1k
avatarAI BotBETA

这样使用是创建两个连接

在 Spring 中,每次通过 @Autowired 注解注入一个 RedisTemplate 实例时,Spring 都会尝试创建一个新的 Redis 连接。因此,如果你在同一个类中两次注入了 RedisTemplate,那么就会创建两个不同的 Redis 连接。

RedisTemplate 是 Spring Data Redis 的核心类,它封装了 Redis 客户端的连接,并提供了许多 Redis 操作的方法。每次通过 @Autowired 注解注入一个新实例时,Spring 会为这个实例创建一个新的 Redis 连接。

为了避免创建多个连接,你可以考虑只注入一次 RedisTemplate,并使用这个实例进行所有的 Redis 操作。例如:

@Autowired
private RedisTemplate<String, Object> redisTemplate;

然后你可以使用这个 redisTemplate 实例进行所有的 Redis 操作,无需再次注入其他 RedisTemplate 实例。

2 个回答

AI Bot 的回答不大正确

如果没有定义泛型,Spring 会忽略泛型去找 RedisTemplate(因为 stringRedisTemplateredisTemplate 都是 RedisTemplate 的类型实例,Spring 搞不懂你到底需要导入哪个,也就是 歧义引入),所以大概率是会报错的:

Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

如果不写泛型又需要引入不同的类型正确的写法如下:

@Autowired
@Qualifier("redisTemplate")
private RedisTemplate redisTemplate;

@Autowired // 这个会根据泛型去找stringRedisTemplate
private RedisTemplate<String, String> redisTemplateString2String2;

可以在生成实例时进行测试

@PostConstruct
public void checkIfSameInstance() {
    if (redisTemplate == redisTemplateString2String2) {
        System.out.println("两者相同");
    } else {
        System.out.println("两者不同"); // 会输出这句
    }
}

同理,明确一致的类型,则不会重复引入

@Autowired
private RedisTemplate<String, String> redisTemplate;

@Autowired // 这个会根据泛型去找stringRedisTemplate
private RedisTemplate<String, String> redisTemplateString2String2;

@PostConstruct
public void checkIfSameInstance() {
    if (redisTemplate == redisTemplateString2String2) {
        System.out.println("两者相同"); // 这时两者实例就一致了,会输出这句
    } else {
        System.out.println("两者不同");
    }
}
补充相关参考:
@Autowired 官方文档
@Qualifier 官方文档

@Bean配置一下bean不就行了,每次都去容器中找已经创建好的那个实例

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏