SpringBoot @Resource注入的坑

一、场景复现

双kafka消费者配置

(1)第一个kafka

public class OneKafkaConfig {@Beanpublic KafkaListenerContainerFactory oneKafkaFactory(@Resource ConsumerFactory oneConsumerFactory) {ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory();factory.setConsumerFactory(oneConsumerFactory);factory.setConcurrency(10);factory.setBatchListener(true);factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);return factory;}@Beanpublic ConsumerFactory oneConsumerFactory(@Resource KafkaProperties oneKafkaProperties){return new DefaultKafkaConsumerFactory(oneKafkaProperties.buildConsumerProperties());}@ConfigurationProperties(prefix = "sys.kafka.one")@Beanpublic KafkaProperties oneKafkaProperties(){return new KafkaProperties();}

 (2)第二个kafka

public class TwoKafkaConfig {@Beanpublic KafkaListenerContainerFactory twoKafkaFactory(@Resource ConsumerFactory twoConsumerFactory) {ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory();factory.setConsumerFactory(twoConsumerFactory);factory.setConcurrency(10);factory.setBatchListener(true);factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);return factory;}@Primary@Beanpublic ConsumerFactory twoConsumerFactory(@Resource KafkaProperties twoKafkaProperties){return new DefaultKafkaConsumerFactory(twoKafkaProperties.buildConsumerProperties());}@Primary@ConfigurationProperties(prefix = "sys.kafka.two")@Beanpublic KafkaProperties twoKafkaProperties(){return new KafkaProperties();}
}

启动项目,发现两个kafka的消费者都是指向同一个kafka,@Resource没有根据名字注入所以依赖的bean。

 

二、分析原因

从debug模式下中发现:twoKafkaProperties、twoConsumerFactory、twoKafkaFactory依次创建。然后先是TwoConsumerFactory先注入创建oneKafkaFactory,而twoKafkaProperties bean先注入创建oneConsumerFactory,最后oneKafkaProperties才开始创建。

 

原因:@Resource注入之前先根据名字查询bean,找不到才根据类型进行bean注入。因为twoConsumerFactory为@Primary优先级高先创建,oneKafkaFactory创建的时候oneConsumerFactory 还没有创建,所以根据类型注入了twoConsumerFactory。

建议:多个类型相同的bean创建不要使用@Resource,应该使用@Autowired + @Qualifier或者重新继承bean的类型。

 

 

三、改造方式

(1)@Autowiredv+ @Qualifier


public class OneKafkaConfig {@Beanpublic KafkaListenerContainerFactory oneKafkaFactory(@Autowired @Qualifier("oneConsumerFactory") ConsumerFactory oneConsumerFactory) {ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory();factory.setConsumerFactory(oneConsumerFactory);factory.setConcurrency(10);factory.setBatchListener(true);factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);return factory;}@Beanpublic ConsumerFactory oneConsumerFactory(@Autowired @Qualifier("oneKafkaProperties") KafkaProperties oneKafkaProperties){return new DefaultKafkaConsumerFactory(oneKafkaProperties.buildConsumerProperties());}@ConfigurationProperties(prefix = "sys.kafka.one")@Beanpublic KafkaProperties oneKafkaProperties(){return new KafkaProperties();}}
public class TwoKafkaConfig {@Beanpublic KafkaListenerContainerFactory twoKafkaFactory(@Autowired @Qualifier("twoConsumerFactory") ConsumerFactory twoConsumerFactory) {ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory();factory.setConsumerFactory(twoConsumerFactory);factory.setConcurrency(10);factory.setBatchListener(true);factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);return factory;}@Primary@Beanpublic ConsumerFactory twoConsumerFactory(@Autowired @Qualifier("twoKafkaProperties") KafkaProperties twoKafkaProperties){return new DefaultKafkaConsumerFactory(twoKafkaProperties.buildConsumerProperties());}@Primary@ConfigurationProperties(prefix = "sys.kafka.two")@Beanpublic KafkaProperties twoKafkaProperties(){return new KafkaProperties();}}

 

(2)重新继承bean的类型

public class OneKafkaConfig {@Beanpublic KafkaListenerContainerFactory oneKafkaFactory(@Autowired OneConsumerFactory oneConsumerFactory) {ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory();factory.setConsumerFactory(oneConsumerFactory);factory.setConcurrency(10);factory.setBatchListener(true);factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);return factory;}@Beanpublic OneConsumerFactory oneConsumerFactory(@Autowired OneKafkaProperties oneKafkaProperties){return new OneConsumerFactory(oneKafkaProperties.buildConsumerProperties());}@ConfigurationProperties(prefix = "sys.kafka.one")@Beanpublic OneKafkaProperties oneKafkaProperties(){return new OneKafkaProperties();}
public class TwoKafkaConfig {@Beanpublic KafkaListenerContainerFactory twoKafkaFactory(@Autowired TwoConsumerFactory twoConsumerFactory) {ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory();factory.setConsumerFactory(twoConsumerFactory);factory.setConcurrency(10);factory.setBatchListener(true);factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);return factory;}@Primary@Beanpublic TwoConsumerFactory twoConsumerFactory(@Autowired TwoKafkaProperties twoKafkaProperties){return new TwoConsumerFactory(twoKafkaProperties.buildConsumerProperties());}@Primary@ConfigurationProperties(prefix = "sys.kafka.two")@Beanpublic TwoKafkaProperties twoKafkaProperties(){return new TwoKafkaProperties();}
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跟着老桂学ASP.NET Core 2.0

.net core作为微软开发技术中跨平台的利器,2.0的发布已经有一段时间了,asp.net core是新一代微软的BS开发框架,同时兼容.net core和.net framework,它的出现,使基于微软体系的BS开发迎来新的契机,开源&…

jzoj4252-QYQ的图【dfs】

正题 题目大意 有nnn个点mmm条边,若一个点没选,那么连接到的点都得选择。求最小选择权值。 解题思路 对于每个联通块暴力dfsdfsdfs,若一个点不选那么就把别的点都选上。 因为每个点至少限制一个点,那么时间复杂度最坏为O(2n2)O…

如何安装并启动django

这里我用的是pip3,一般没装两个版本的用pip就行了 安装 pip3 install django如何检测 python3 -m django --version显示版本号即可 如何创建并启动项目 创建 django-admin startproject HelloWorld启动 然后cd到HelloWorld目录里 python manage.py runserver…

Hadoop生态hive(四)数据类型

转载自 Hive数据类型 一、列类型 列类型被用作Hive的列数据类型。它们如下: (1)整型 整型数据可以指定使用整型数据类型,INT。当数据范围超过INT的范围,需要使用BIGINT,如果数据范围比INT小&#xff0…

ASP.NET Core 认证与授权[6]:授权策略是怎么执行的?

在上一章中ASP.NET Core 认证与授权[5]:初识授权,详细介绍了 ASP.NET Core 中的授权策略,在需要授权时,只需要在对应的Controler或者Action上面打上[Authorize]特性,并指定要执行的策略名称即可,但是,授权策…

jzoj4248-n染色【数学,快速幂】

正题 题目大意 一个环,nnn个部分mmm个颜色求每段连续的都不同颜色的方案数。 解题思路 打表找一下规律发现 fifi−1∗(m−1)fi−2∗(m−1)f_if_{i-1}*(m-1)f_{i-2}*(m-1)fi​fi−1​∗(m−1)fi−2​∗(m−1) 然后特征根:fi(m−1)n(m−1)∗(−1)nf_i(m-1)^n(m-1)*…

SpringBoot2.1.9 多Redis Jedis配置

一、配置文件 pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>redis.clients</groupId><artifa…

.net core2.0下使用Identity改用dapper存储数据

前言、 已经好多天没写博客了&#xff0c;鉴于空闲无聊之时又兴起想写写博客&#xff0c;也当是给自己做个笔记。过了这么些天&#xff0c;我的文笔还是依然那么烂就请多多谅解了。今天主要是分享一下在使用.net core2.0下的实际遇到的情况。在使用webapi时用了identity做用户验…

如何解决vuepress部署出现样式问题

以前在安装hexo的时候出了样式问题&#xff0c;现在用vuepress也出现了相同的问题。 本地测试完全可以 然而打包之后就彻底乱了 即使是自己本地打包成dist之后也会出现相同的问题 有点困扰&#xff0c;应该是打包配置的问题 通过修改index.html里的内容。将/改为./ 发现部…

jzoj4249-游戏【贪心】

正题 题目大意 0∼n0\sim n0∼n的点&#xff0c;从iii移动到jjj获得aj∗(j−i)a_j*(j-i)aj​∗(j−i)的价值。求最大价值。 解题思路 考虑贪心&#xff0c;每次移动到往后aia_iai​最大的点。 证明: 反证明:我们假设有一种情况i<ji<ji<j且aj<aia_j<a_iaj​<…

想使用Docker容器?先看看这些注意事项

Docker容器无疑是最近十年来最引人注目的技术之一&#xff0c;因为有了它&#xff0c;对我们思考设计、开发和运维软件的方式产生了非常有益的影响。 但是就像每一个开发工具一样&#xff0c;为了充分利用这些工具&#xff0c;需要注意一些使用中问题&#xff0c;Docker容器也是…

SpringBoot2.1.9 多数据源JDBC配置

一、配置文件 pom.xm <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.10.RELEASE</version> </dependency> <dependency><groupId>mysql</groupId>…

Vs Code如何自定义设置一键代码补全

有时候是不是看到别人输入一个vue就能打印整个代码&#xff0c;感觉很神奇&#xff0c;本文就以vue为案例教你如何使用这种骚操作&#xff01;&#xff01;&#xff01; 点击文件->首选项->用户代码片段 输入vue.json&#xff08;如果没有则新建代码片段&#xff09; &…

欢乐纪中某B组赛【2019.1.30】The penultimate day

前言 TodayisthepenultimatedayToday\ is\ the penultimate dayToday is thepenultimateday 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC3332017zyc2017zyc2017zyc2502502509090901001001006060601010102017xxy2017xxy2017xxy22022…

Realm发布Realm .NET,扩展支持.NET技术栈

继去年夏天Realm引入对.NET Core的支持&#xff0c;使开发者可以用C#来构建移动应用之后&#xff0c;Realm发布了Realm .NET。Realm .NET是一个可以让开发者更好地集成他们的.NET技术栈的新组件集。 其中一个组件&#xff0c;是针对.NET的Global Notifier&#xff0c;可以实现大…

SpringBoot2.1.9 多数据源Mybatis—JDBC配置

一、配置文件 pom.xm <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency><groupId>mysql</groupId><artifactId>mysql-c…

居中对齐

自绝父相 现在有一个父盒子和一个子盒子 要想让子盒子相对父盒子居中很简单&#xff0c;在子盒子上加上属性即可 margin: 0 auto;如果说要变成水平垂直居中呢&#xff0c;加上两个auto?结果肯定是不行的 得这样 用到所谓得子绝父相 首先父亲要相对定位 然后儿子设置成这样 l…

P3128-最大流Max Flow【树上差分,LCA】

正题 题目大意 一棵树 若干条路径&#xff0c;哪个点经过的路径最多&#xff0c;求路径条数。 解题思路 对于每条路径计算一次LCALCALCA&#xff0c;然后树上差分就好了。 codecodecode #include<cstdio> #include<queue> #include<cmath> using namespac…

IdentityServer4(10)- 添加对外部认证的支持之QQ登录

前言 前面我们提到过IdentityServer4是可以添加外部认证的&#xff0c;如果外部认证支持OAuth2&#xff0c;那么添加到IdentityServer4是非常简单的&#xff0c;在ASP.NET Core下提供了非常多的外部认证实现&#xff0c;比如Google&#xff0c;Facebook&#xff0c;Twitter&…

css字体样式

以下写几个常用的字体样式&#xff0c;方便以后使用&#xff1a; font-family: FangSong;font-weight: bold;font-size: 20px;font-style: italic;text-decoration: underline;letter-spacing: 1em;line-height: 2em;简写&#xff1a;font:bold 20px FangSong样式作用font-fami…