<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Spring Boot Map 依賴注入血坑實錄:為什么我的 Map 總是少了一半數據?

      凌晨三點改BUG:一個Map引發的「玄學」問題

      團隊在擴展Spring Kafka租戶功能時,遇到了一個詭異的現象:
      注入的Map<String, KafkaTemplate>始終無法獲取完整的實例,明明配置了多個模板,打印出來卻只有默認的一個!
      當時以為是Bean加載順序問題,折騰了兩天debug,甚至被AI誤導走了彎路,最后才發現——這竟是Spring Map依賴注入的「隱藏機制」在作祟!

      先看示例:理想與現實的「殘酷」對比

      以Spring Boot 2.x為例,我們先構造一個簡化場景:

      1. 用戶模型類

      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class User {
          private String name;
          private Integer age;
      }
      

      2. 注入Map的Bean(期望打印兩個數據)

      @RequiredArgsConstructor
      @Component
      public class MyMapBean implements CommandLineRunner {
      
          @Autowired
          private Map<String, User> myMap;
      
          @Override
          public void run(String... args) throws Exception {
              myMap.forEach((k, v) -> System.out.println("key:" + k + " value:" + v));
              // 預期輸出:
              // key:user value:User(name=lybgeek, age=18)
              // key:user2 value:User(name=lybgeek2, age=19)
              // 實際輸出:
              // key:user value:User(name=lybgeek, age=18)
          }
      }
      

      3. 配置類(我們以為注入的是這個Map)

      @Configuration
      public class MyMapConfig {
          
          @Bean
          @ConditionalOnMissingBean(name = "myMap")
          public Map<String, User> myMap() {
              Map<String, User> myMap = new LinkedHashMap<>();
              myMap.put("user", user());
              myMap.put("user2", new User("lybgeek2", 19));
              return myMap;
          }
          
          @Bean
          public User user() {
              User user = new User();
              user.setName("lybgeek");
              user.setAge(18);
              return user;
          }
      }
      

      為什么user2消失了?
      難道Spring會「偷」我的Map數據?

      真相解析:Spring Map注入的「自動收集」機制

      核心結論:

      當使用@Autowired Map<String, T>時,Spring會執行以下邏輯:

      1. 按類型查找:找到容器中所有類型為T的Bean(本例中為User
      2. 自動封裝:將Bean名稱作為Key,Bean實例作為Value,存入Map
      3. 「忽略」自定義Map:若容器中存在多個T類型Bean,Spring會優先「收集」這些Bean,而非注入你手動創建的Map!

      底層原理(源碼追蹤)

      關鍵鏈路在DefaultListableBeanFactory#resolveMultipleBeans

      1. 當注入Map<T, V>時,Spring會解析泛型V,查找所有V類型的Bean
      2. 例如本例中,User類型的Bean只有一個user(),因此Map中只有一個條目
      3. 你手動創建的myMap() Bean,會被Spring視為「普通Map」,除非顯式指定,否則不會被注入

      三種「自救」方案:從此告別Map注入玄學

      方案1:@Resource替換@Autowired(簡單粗暴)

      @Resource(name = "myMap")  // 按名稱精準查找
      private Map<String, User> myMap;
      

      原理@Resource優先按名稱匹配,不再觸發「類型收集」機制。

      方案2:@Qualifier限定Bean名稱(優雅兼容)

      @Autowired
      @Qualifier("myMap")  // 顯式指定注入myMap Bean
      private Map<String, User> myMap;
      

      適用場景:需要保留@Autowired按類型注入,但需排除默認收集邏輯。

      方案3:手動從容器獲取(終極方案)

      @Autowired
      private ApplicationContext applicationContext;
      
      // 在需要時獲取
      Map<String, User> myMap = applicationContext.getBean("myMap", Map.class);
      

      優勢:徹底掌握控制權,適合復雜場景下的精準調用。

      團隊真實案例:從「AI誤導」到「源碼救贖」

      回到最初的Kafka模板問題:

      1. 我們注入的Map<String, KafkaTemplate>本應包含多個租戶模板
      2. 但Spring自動收集了所有KafkaTemplate類型的Bean,而我們自定義的Map被忽略
      3. AI給出的「BeanPostProcessor時機問題」解決方案完全跑偏,最終靠逐行調試源碼才定位到問題

      避坑指南:3個必須記住的Map注入原則

      1. @Autowired + Map<T, V> = 自動收集所有V類型Bean,除非顯式限定
      2. 自定義Map必須用@Resource或@Qualifier指定名稱,否則會被「類型收集」覆蓋
      3. 復雜場景優先手動獲取BeanapplicationContext.getBean),避免隱式邏輯挖坑

      文末靈魂拷問:你被Spring「坑」過嗎?

      開發中總有一些「反直覺」的框架設計,讓你debug到懷疑人生。

      • 你遇到過哪些類似的「玄學」問題?
      • 你是如何靠源碼調試「手撕」BUG的?

      歡迎留言分享你的避坑經驗,點贊收藏這篇文章,讓更多開發者少走彎路!

      posted @ 2025-10-24 09:21  Linyb極客之路  閱讀(5)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 一本无码人妻在中文字幕免费| 男女性高爱潮免费网站| 精品91在线| 日本韩国一区二区精品| 国产精品成人综合色在线| 久久精品国产91精品亚洲| 91中文字幕一区在线| 国产成人亚洲一区二区三区| 成人午夜在线观看刺激| 国产普通话对白刺激| 亚洲一区二区国产av| 亚洲av成人免费在线| 亚洲一区二区三区播放| 中文字幕久久波多野结衣av| 九九热在线视频免费播放| 精品黄色av一区二区三区 | 久久久久国产精品熟女影院| 国产精品国产精品偷麻豆| 国产一区二区在线激情往| 国产成人AV一区二区三区无码| 福利一区二区在线视频| 亚洲精品尤物av在线网站| 中国产无码一区二区三区| 久久精品一本到99热免费| yw尤物av无码国产在线观看| 久久这里只精品国产免费9| 内射少妇一区27p| 最新国产精品好看的精品| 中文字幕少妇人妻精品| 洛扎县| 高清中文字幕国产精品| 久久精品国产亚洲av麻豆长发| 天堂中文最新版在线官网在线 | 狼人大伊人久久一区二区| 国产一区二区午夜福利久久| 午夜综合网| 在线国产精品中文字幕| 国产成人av免费网址| 99精品国产精品一区二区| 99久久久国产精品免费无卡顿| 丰满爆乳一区二区三区|