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

Spring如何正確注入集合類型

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

集合類型的自動(dòng)注入是Spring提供的另外一個(gè)強(qiáng)大功能。我們?cè)诜奖愕氖褂靡蕾囎⑷氲奶匦詴r(shí),必須要思考對(duì)象從哪里注入、怎么創(chuàng)建、為什么是注入這一個(gè)對(duì)象的。雖然編寫(xiě)框架的目的是讓開(kāi)發(fā)人員無(wú)需關(guān)心太多底層細(xì)節(jié),能專心業(yè)務(wù)邏輯的開(kāi)發(fā),但是作為開(kāi)發(fā)人員不能真的無(wú)腦去使用框架。
務(wù)必學(xué)會(huì)注入集合等高級(jí)用法,讓自己有所提升!

現(xiàn)在有一需求:存在多個(gè)用戶Bean,找出來(lái)存儲(chǔ)到一個(gè)List。

1 注入方式

1.1 收集方式

多個(gè)用戶Bean定義:

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

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

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

1.2 直接裝配方式

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

這是為啥呢?

2 源碼解析

就得精通這兩種注入風(fēng)格在Spring分別如何實(shí)現(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());
      }
      // 轉(zhuǎn)化查到的所有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

目標(biāo)類型定義為L(zhǎng)ist users,所以元素類型為User:

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

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

3 將匹配的所有的Bean按目標(biāo)類型轉(zhuǎn)化

上一步獲取的所有的Bean都以java.util.LinkedHashMap.LinkedValues存儲(chǔ),和目標(biāo)類型大不相同,所以最后按需轉(zhuǎn)化。

本案例中,需轉(zhuǎn)化為L(zhǎng)ist:

2.2 直接裝配方式

DefaultListableBeanFactory#findAutowireCandidates

不再贅述。

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

當(dāng)同時(shí)滿足這兩種裝配方式時(shí),Spring會(huì)如何處理呢?

DefaultListableBeanFactory#doResolveDependency

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

  • 當(dāng)使用收集裝配時(shí),能找到任一對(duì)應(yīng)Bean,則返回
  • 若一個(gè)都沒(méi)找到,才采用直接裝配

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

3 修正

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

只使用收集方式:

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

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

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

相關(guān)文章

最新評(píng)論

双流县| 莆田市| 开江县| 元朗区| 托克逊县| 桃园市| 石城县| 迁西县| 云和县| 莆田市| 鄢陵县| 绥宁县| 邯郸市| 宁武县| 信丰县| 进贤县| 苍梧县| 两当县| 专栏| 漳平市| 玉溪市| 黄陵县| 建平县| 建瓯市| 兰坪| 万盛区| 富锦市| 武义县| 长泰县| 西昌市| 宜州市| 永新县| 延边| 湄潭县| 华阴市| 曲水县| 商城县| 南雄市| 吉林省| 宁陕县| 荔浦县|