当前位置: 首页 > 知识库问答 >
问题:

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

归和惬
2023-12-04
@AutowiredRedisTemplate redisTemplate;@AutowiredRedisTemplate<String, String> redisTemplateString2String;

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

@AutowiredRedisTemplate redisTemplate;@AutowiredRedisTemplate<String, String> redisTemplateString2String;

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

共有3个答案

慕容兴贤
2023-12-04

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 // 这个会根据泛型去找stringRedisTemplateprivate RedisTemplate<String, String> redisTemplateString2String2;

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

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

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

@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Autowired // 这个会根据泛型去找stringRedisTemplateprivate RedisTemplate<String, String> redisTemplateString2String2;@PostConstructpublic void checkIfSameInstance() {    if (redisTemplate == redisTemplateString2String2) {        System.out.println("两者相同"); // 这时两者实例就一致了,会输出这句    } else {        System.out.println("两者不同");    }}
补充相关参考:
@Autowired 官方文档
@Qualifier 官方文档
小牛22980
2023-12-04

RestTemplate只是个抽象封装,实现是依赖其他http框架的,比如HttpUrlConnection/apache http client,创建几个连接、什么时候创建也都取决于底层实现

方轩昂
2023-12-04

这样使用是创建两个连接

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

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

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

@Autowiredprivate RedisTemplate<String, Object> redisTemplate;

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

 类似资料:
  • 问题内容: 下面的代码通过SSH在一台计算机上运行grep并打印结果: 我如何一次将5台机器全部置入grep(这样就不会造成重大延迟),而不是将所有这些都放入5个变量中并全部打印出来。 问题答案: 您需要将调用放在单独的线程(或进程中,但这可能会过大),这反过来又要求代码位于函数中(无论如何,这是一个好主意:模块的顶部没有大量代码水平)。 例如: If you had many more than

  • 如何创建将不同列与不同表合并的视图?例如,我有三个表:用户、物品和礼物(在本例中,这是一个用户可以向另一个用户赠送礼物的系统) < code>users表包含有关用户的信息,< code>items表包含有关项目的信息,< code>gifts表显示哪个用户向哪个用户发送了什么礼物。 我想要的是创建如下视图:

  • 我需要在我的Spring Boot 2应用程序中配置多个LDAP数据源/ LdapTemplates。第一个LdapTemplate将用于大部分工作,而第二个将用于偶尔出现的数据子集(存放在其他地方)。 我读过这些关于StackOverflow的问题,但它们似乎适用于Spring Boot 1。 一个Spring ldap存储库项目可以访问两个不同的ldap目录吗 具有Spring LDAP Re

  • 我使用具有以下设置的Hikary连接池: 在getConnection()之后,hikari尝试获取到实例的2个连接,但只将一个连接放在连接池中。我怎样才能修好它?hikari版本是

  • 我试图连接两个字符串,一个字符串有一些值,另一个字符串有空。 示例: 并用concat函数和运算符连接这两个字符串 示例: 根据我的理解,当在concat函数中使用空字符串时,因为string2是空的,所以不会创建新的引用。但在使用运算符时,将在字符串池常量中创建一个新引用。但在下面的代码中,当使用运算符时,不会创建新的引用。 输出: 字符串1:69066349 类别:69066349 相同的 第

  • 我试图加入2 KTables。 合并功能非常简单,我只是将值从一个bean复制到另一个bean。 但由于某些原因,join函数在单个生成的记录上调用了两次。请参阅下面的流媒体/制作人配置 生产者配置- 接下来,我将提交每个流的单个记录。两个记录具有相同的密钥。我希望收到一条记录作为输出。 但是ValueJoiner触发了2次,我得到了2条相同的输出记录,而不是一条。在触发时间内-两个流中的值都存在