當前位置:
                    首頁 >
                            前端技术
>                            javascript
>内容正文                
                        
                    javascript
SpringBoot @Resource注入的坑
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                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();} }?
?
總結
以上是生活随笔為你收集整理的SpringBoot @Resource注入的坑的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 音频服务未运行怎么办 四个步骤简单告诉大
- 下一篇: 曼陀沙华的寓意是什么
