最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring如何正確注入集合類型

 更新時間:2021年09月15日 08:55:28   作者:JavaEdge.  
這篇文章主要介紹了Spring如何正確注入集合類型,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

集合類型的自動注入是Spring提供的另外一個強大功能。我們在方便的使用依賴注入的特性時,必須要思考對象從哪里注入、怎么創(chuàng)建、為什么是注入這一個對象的。雖然編寫框架的目的是讓開發(fā)人員無需關心太多底層細節(jié),能專心業(yè)務邏輯的開發(fā),但是作為開發(fā)人員不能真的無腦去使用框架。
務必學會注入集合等高級用法,讓自己有所提升!

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

1 注入方式

1.1 收集方式

多個用戶Bean定義:

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

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

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

1.2 直接裝配方式

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

這是為啥呢?

2 源碼解析

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

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()) {
      // 裝配數(shù)組
      return result;
   }
   else if (Collection.class.isAssignableFrom(type) && type.isInterface()) {
      // 裝配集合
      // 獲取集合的元素類型
      Class<?> elementType = descriptor.getResolvableType().asCollection().resolveGeneric();
      if (elementType == null) {
         return null;
      }
      // 根據(jù)元素類型查找所有的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:

2 根據(jù)元素類型找出所有Bean

有了elementType,即可據(jù)其找出所有Bean:

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

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

本案例中,需轉化為List:

2.2 直接裝配方式

DefaultListableBeanFactory#findAutowireCandidates

不再贅述。

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

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

DefaultListableBeanFactory#doResolveDependency

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

  • 當使用收集裝配時,能找到任一對應Bean,則返回
  • 若一個都沒找到,才采用直接裝配

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

3 修正

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

只使用收集方式:

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

  1. Bean上使用@Order注解,如@Order(2)。數(shù)值越小表示優(yōu)先級越高。默認優(yōu)先級最低。
  2. @DependsOn 使用它,可使得依賴的Bean如果未被初始化會被優(yōu)先初始化。
  3. 添加@Order(number)注解,number越小優(yōu)先級越高,越靠前聲
  4. 明user這些Bean時將id=2的user提到id=1之前

到此這篇關于Spring如何正確注入集合類型的文章就介紹到這了,更多相關Spring 集合類型內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

潞城市| 内丘县| 剑川县| 大足县| 高安市| 榆树市| 招远市| 瑞丽市| 玛曲县| 陈巴尔虎旗| 延津县| 称多县| 城市| 洞头县| 壤塘县| 从江县| 武威市| 白朗县| 林芝县| 新乡市| 南皮县| 赤水市| 南华县| 磴口县| 银川市| 秦安县| 五台县| 曲靖市| 惠安县| 酉阳| 德阳市| 大连市| 合肥市| 栾城县| 曲阜市| 镇康县| 海兴县| 夏津县| 乌兰察布市| 普宁市| 贞丰县|