中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring怎么正確注入集合類型

發布時間:2021-09-15 10:45:15 來源:億速云 閱讀:147 作者:小新 欄目:開發技術

這篇文章主要介紹了Spring怎么正確注入集合類型,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    集合類型的自動注入是Spring提供的另外一個強大功能。我們在方便的使用依賴注入的特性時,必須要思考對象從哪里注入、怎么創建、為什么是注入這一個對象的。雖然編寫框架的目的是讓開發人員無需關心太多底層細節,能專心業務邏輯的開發,但是作為開發人員不能真的無腦去使用框架。

    現在有一需求:存在多個用戶Bean,找出來存儲到一個List。

    1 注入方式

    1.1 收集方式

    多個用戶Bean定義:

    Spring怎么正確注入集合類型

    有了集合類型的自動注入后,即可收集零散的用戶Bean:

    Spring怎么正確注入集合類型

    這樣即可完成集合類型注入:

    Spring怎么正確注入集合類型

    但當持續增加一些user時,可能就不喜歡用上述的注入集合類型了,而是這樣:

    1.2 直接裝配方式

    Spring怎么正確注入集合類型

    Spring怎么正確注入集合類型

    分開玩,大家應該不會有啥問題,若兩種方式共存了,會咋樣?
    運行程序后發現直接裝配方式的未生效:

    Spring怎么正確注入集合類型

    這是為啥呢?

    2 源碼解析

    就得精通這兩種注入風格在Spring分別如何實現的。

    2.1 收集裝配

    DefaultListableBeanFactory#resolveMultipleBeans

    private Object resolveMultipleBeans(DependencyDescriptor descriptor, @Nullable String beanName,
          @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) {
       final Class<?> type = descriptor.getDependencyType();
       if (descriptor instanceof StreamDependencyDescriptor) {
          // 裝配stream
          return stream;
       }
       else if (type.isArray()) {
          // 裝配數組
          return result;
       }
       else if (Collection.class.isAssignableFrom(type) && type.isInterface()) {
          // 裝配集合
          // 獲取集合的元素類型
          Class<?> elementType = descriptor.getResolvableType().asCollection().resolveGeneric();
          if (elementType == null) {
             return null;
          }
          // 根據元素類型查找所有的bean
          Map<String, Object> matchingBeans = findAutowireCandidates(beanName, elementType,
                new MultiElementDescriptor(descriptor));
          if (matchingBeans.isEmpty()) {
             return null;
          }
          if (autowiredBeanNames != null) {
             autowiredBeanNames.addAll(matchingBeans.keySet());
          }
          // 轉化查到的所有bean放置到集合并返回
          TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
          Object result = converter.convertIfNecessary(matchingBeans.values(), type);
          // ...
          return result;
       }
       else if (Map.class == type) {
          // 解析map
          return matchingBeans;
       }
       else {
          return null;
       }
    }
    1 獲取集合類型的elementType

    目標類型定義為List users,所以元素類型為User:

    Spring怎么正確注入集合類型

    2 根據元素類型找出所有Bean

    有了elementType,即可據其找出所有Bean:

    Spring怎么正確注入集合類型

    3 將匹配的所有的Bean按目標類型轉化

    上一步獲取的所有的Bean都以java.util.LinkedHashMap.LinkedValues存儲,和目標類型大不相同,所以最后按需轉化。

    本案例中,需轉化為List:

    Spring怎么正確注入集合類型

    2.2 直接裝配方式

    DefaultListableBeanFactory#findAutowireCandidates

    不再贅述。

    最后就是根據目標類型直接尋找匹配Bean名稱為users的List<user>裝配給userController#users屬性。

    當同時滿足這兩種裝配方式時,Spring會如何處理呢?

    DefaultListableBeanFactory#doResolveDependency

    Spring怎么正確注入集合類型

    顯然這兩種裝配集合的方式不能同存,結合本案例:

    • 當使用收集裝配時,能找到任一對應Bean,則返回

    • 若一個都沒找到,才采用直接裝配

    所以后期以List方式直接添加的user Bean都不生效!

    3 修正

    務必避免兩種方式共存去裝配集合!只選用一種方式即可。
    比如只使用直接裝配:

    Spring怎么正確注入集合類型

    只使用收集方式:

    Spring怎么正確注入集合類型

    如何做到讓用戶2優先輸出呢?
    控制spring bean加載順序:

    1. Bean上使用@Order注解,如@Order(2)。數值越小表示優先級越高。默認優先級最低。

    2. @DependsOn 使用它,可使得依賴的Bean如果未被初始化會被優先初始化。

    3. 添加@Order(number)注解,number越小優先級越高,越靠前聲

    4. 明user這些Bean時將id=2的user提到id=1之前

    感謝你能夠認真閱讀完這篇文章,希望小編分享的“Spring怎么正確注入集合類型”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    柘荣县| 措美县| 石阡县| 海兴县| 明光市| 泽州县| 西盟| 广东省| 山西省| 鄯善县| 封丘县| 垣曲县| 宾阳县| 北京市| 萍乡市| 邵阳市| 玉林市| 乌兰县| 米林县| 东城区| 旬邑县| 荥经县| 察雅县| 神农架林区| 辽中县| 平乡县| 阿坝| 马边| 玉溪市| 鹰潭市| 伊通| 汝阳县| 鹿邑县| 股票| 桃江县| 绥棱县| 古蔺县| 嫩江县| 晴隆县| 科技| 东乌珠穆沁旗|