日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

詳解Spring支持的各種數(shù)據(jù)類型的注入,你都用過哪些?

來源: 責(zé)編: 時間:2023-09-18 21:42:16 420觀看
導(dǎo)讀1 判斷類型注入的屬性判斷其類型:OptionalObjectFactoryObjectProviderjavax.inject.Providerpublic class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListable

1 判斷類型

注入的屬性判斷其類型:bhc28資訊網(wǎng)——每日最新資訊28at.com

  1. Optional
  2. ObjectFactory
  3. ObjectProvider
  4. javax.inject.Provider
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {    private static Class<?> javaxInjectProviderClass;    static {        try {            javaxInjectProviderClass =                    ClassUtils.forName("javax.inject.Provider", DefaultListableBeanFactory.class.getClassLoader());        } catch (ClassNotFoundException ex) {            javaxInjectProviderClass = null;        }    }    public Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,            @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {        if (Optional.class == descriptor.getDependencyType()) {            return createOptionalDependency(descriptor, requestingBeanName);        } else if (ObjectFactory.class == descriptor.getDependencyType() ||                ObjectProvider.class == descriptor.getDependencyType()) {            return new DependencyObjectProvider(descriptor, requestingBeanName);        } else if (javaxInjectProviderClass == descriptor.getDependencyType()) {            return new Jsr330Factory().createDependencyProvider(descriptor, requestingBeanName);        } else {            // 判斷是否有@Lazy注解,如果有該注解那么會創(chuàng)建代理對象,否則返回null            // 總結(jié):如果注入的屬性有@Lazy注解,那么會返回由ProxyFactory對象創(chuàng)建的代理對象            Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary(descriptor, requestingBeanName);            if (result == null) {                // 解析查找依賴注入的對象                result = doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter);            }            return result;        }    }}

2 查找依賴對象

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {  public Object doResolveDependency(DependencyDescriptor descriptor, @Nullable String beanName,            @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {    InjectionPoint previousInjectionPoint = ConstructorResolver.setCurrentInjectionPoint(descriptor);    try {      Object shortcut = descriptor.resolveShortcut(this);      if (shortcut != null) {          return shortcut;      }      Class<?> type = descriptor.getDependencyType();      // 判斷需要注入的類型是否是一個集合(如何:List<Users> beans)      // 2.1       Object multipleBeans = resolveMultipleBeans(descriptor, beanName, autowiredBeanNames, typeConverter);      if (multipleBeans != null) {          return multipleBeans;      }      // 查找與所需類型匹配的bean實例      // 2.2      Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor);      if (matchingBeans.isEmpty()) {          if (isRequired(descriptor)) {              raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);          }          return null;      }      String autowiredBeanName;      Object instanceCandidate;      // 如果找到多個      if (matchingBeans.size() > 1) {          // 在這里會判斷多個Bean中是否有一個@Primary注解的Bean          // 如果沒有@Primary,繼續(xù)獲取是否有@Priority(優(yōu)先級)注解          // 如果沒有則返回null,如果有則返回值越小的優(yōu)先級越高(如果有多個優(yōu)先級一樣,則系統(tǒng)報錯)          // 如果上面都返回的null,那么最后會通過beanName進(jìn)行匹配          autowiredBeanName = determineAutowireCandidate(matchingBeans, descriptor);          if (autowiredBeanName == null) {              if (isRequired(descriptor) || !indicatesMultipleBeans(type)) {                  // 如果是必須的 或者 不是集合類型的Bean注入;那么這里拋出異常                  return descriptor.resolveNotUnique(descriptor.getResolvableType(), matchingBeans);              } else {                  return null;              }          }          instanceCandidate = matchingBeans.get(autowiredBeanName);      } else {          // We have exactly one match.          Map.Entry<String, Object> entry = matchingBeans.entrySet().iterator().next();          autowiredBeanName = entry.getKey();          instanceCandidate = entry.getValue();      }      if (autowiredBeanNames != null) {          autowiredBeanNames.add(autowiredBeanName);      }      if (instanceCandidate instanceof Class) {          instanceCandidate = descriptor.resolveCandidate(autowiredBeanName, type, this);      }      Object result = instanceCandidate;      if (result instanceof NullBean) {          if (isRequired(descriptor)) {              raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);          }          result = null;      }      if (!ClassUtils.isAssignableValue(type, result)) {          throw new BeanNotOfRequiredTypeException(autowiredBeanName, type, instanceCandidate.getClass());      }      return result;    } finally {        ConstructorResolver.setCurrentInjectionPoint(previousInjectionPoint);    }  }}

2.1 判斷集合類型

判斷需要注入的屬性的數(shù)據(jù)類型是否是如下幾種。bhc28資訊網(wǎng)——每日最新資訊28at.com

  1. StreamDependencyDescriptor
  2. Array
  3. Collection
  4. Map
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {  private Object resolveMultipleBeans(DependencyDescriptor descriptor, @Nullable String beanName,          @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) {    Class<?> type = descriptor.getDependencyType();    if (descriptor instanceof StreamDependencyDescriptor) {      Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor);      if (autowiredBeanNames != null) {        autowiredBeanNames.addAll(matchingBeans.keySet());      }      Stream<Object> stream = matchingBeans.keySet().stream()              .map(name -> descriptor.resolveCandidate(name, type, this))              .filter(bean -> !(bean instanceof NullBean));      if (((StreamDependencyDescriptor) descriptor).isOrdered()) {        stream = stream.sorted(adaptOrderComparator(matchingBeans));      }      return stream;    } else if (type.isArray()) {      Class<?> componentType = type.getComponentType();      ResolvableType resolvableType = descriptor.getResolvableType();      Class<?> resolvedArrayType = resolvableType.resolve(type);      if (resolvedArrayType != type) {        componentType = resolvableType.getComponentType().resolve();      }      if (componentType == null) {        return null;      }      Map<String, Object> matchingBeans = findAutowireCandidates(beanName, componentType, new MultiElementDescriptor(descriptor));      if (matchingBeans.isEmpty()) {        return null;      }      if (autowiredBeanNames != null) {        autowiredBeanNames.addAll(matchingBeans.keySet());      }      TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());      Object result = converter.convertIfNecessary(matchingBeans.values(), resolvedArrayType);      if (result instanceof Object[]) {        Comparator<Object> comparator = adaptDependencyComparator(matchingBeans);        if (comparator != null) {          Arrays.sort((Object[]) result, comparator);        }      }      return result;    } else if (Collection.class.isAssignableFrom(type) && type.isInterface()) {      Class<?> elementType = descriptor.getResolvableType().asCollection().resolveGeneric();      if (elementType == null) {        return null;      }      Map<String, Object> matchingBeans = findAutowireCandidates(beanName, elementType,new MultiElementDescriptor(descriptor));      if (matchingBeans.isEmpty()) {        return null;      }      if (autowiredBeanNames != null) {        autowiredBeanNames.addAll(matchingBeans.keySet());      }      TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());      Object result = converter.convertIfNecessary(matchingBeans.values(), type);      if (result instanceof List) {        if (((List<?>) result).size() > 1) {          Comparator<Object> comparator = adaptDependencyComparator(matchingBeans);          if (comparator != null) {              ((List<?>) result).sort(comparator);          }        }      }      return result;    } else if (Map.class == type) {      ResolvableType mapType = descriptor.getResolvableType().asMap();      Class<?> keyType = mapType.resolveGeneric(0);      if (String.class != keyType) {        return null;      }      Class<?> valueType = mapType.resolveGeneric(1);      if (valueType == null) {        return null;      }      Map<String, Object> matchingBeans = findAutowireCandidates(beanName, valueType,new MultiElementDescriptor(descriptor));      if (matchingBeans.isEmpty()) {        return null;      }      if (autowiredBeanNames != null) {        autowiredBeanNames.addAll(matchingBeans.keySet());      }      return matchingBeans;    } else {      return null;    }  }}

2.2 查找Bean

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {  protected Map<String, Object> findAutowireCandidates(          @Nullable String beanName, Class<?> requiredType, DependencyDescriptor descriptor) {    // 通過類型獲取指定類型的Bean    String[] candidateNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(            this, requiredType, true, descriptor.isEager());    Map<String, Object> result = CollectionUtils.newLinkedHashMap(candidateNames.length);    // resolvableDependencies 集合中保存了,容器內(nèi)置的和自定義注冊的依賴注入對象    //(如:HttpServletRequest對象的注入為該集合內(nèi)部指定的對象)    for (Map.Entry<Class<?>, Object> classObjectEntry : this.resolvableDependencies.entrySet()) {        Class<?> autowiringType = classObjectEntry.getKey();      if (autowiringType.isAssignableFrom(requiredType)) {        Object autowiringValue = classObjectEntry.getValue();        autowiringValue = AutowireUtils.resolveAutowiringValue(autowiringValue, requiredType);        if (requiredType.isInstance(autowiringValue)) {          result.put(ObjectUtils.identityToString(autowiringValue), autowiringValue);          break;        }      }    }    for (String candidate : candidateNames) {      // 判斷是否自己引用自己      if (!isSelfReference(beanName, candidate) && isAutowireCandidate(candidate, descriptor)) {        addCandidateEntry(result, candidate, descriptor, requiredType);      }    }    if (result.isEmpty()) {      boolean multiple = indicatesMultipleBeans(requiredType);      // Consider fallback matches if the first pass failed to find anything...      DependencyDescriptor fallbackDescriptor = descriptor.forFallbackMatch();      for (String candidate : candidateNames) {        if (!isSelfReference(beanName, candidate) && isAutowireCandidate(candidate, fallbackDescriptor) &&                (!multiple || getAutowireCandidateResolver().hasQualifier(descriptor))) {          addCandidateEntry(result, candidate, descriptor, requiredType);        }      }      if (result.isEmpty() && !multiple) {        // Consider self references as a final pass...        // but in the case of a dependency collection, not the very same bean itself.        for (String candidate : candidateNames) {          if (isSelfReference(beanName, candidate) &&                  (!(descriptor instanceof MultiElementDescriptor) || !beanName.equals(candidate)) &&                  isAutowireCandidate(candidate, fallbackDescriptor)) {            addCandidateEntry(result, candidate, descriptor, requiredType);          }        }      }    }    return result;  }}

以上就是Spring在注入屬性的時候會判斷是什么數(shù)據(jù)類型進(jìn)行相應(yīng)的操作bhc28資訊網(wǎng)——每日最新資訊28at.com

完畢!!!bhc28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-10486-0.html詳解Spring支持的各種數(shù)據(jù)類型的注入,你都用過哪些?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Springboot — 用更優(yōu)雅的方式發(fā)HTTP請求(RestTemplate詳解)

下一篇: 為什么我更喜歡基于主干的開發(fā)

標(biāo)簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
禁久久精品乱码| 免费试看一区| 1769国内精品视频在线播放| 欧美不卡视频一区发布| 亚洲免费播放| 一区二区三区精品在线| 日韩视频免费看| 亚洲免费精彩视频| 夜夜嗨一区二区三区| 亚洲一区二区高清视频| 亚洲在线播放| 久久成人国产| 欧美不卡福利| 欧美剧在线观看| 国产精品vvv| 国产日产亚洲精品| 在线不卡欧美| 日韩视频免费在线观看| 亚洲线精品一区二区三区八戒| 亚洲一区二区三区三| 久久国产欧美精品| 欧美国产第一页| 欧美日韩免费在线观看| 国产精品一区二区女厕厕| 国产自产在线视频一区| 亚洲国产成人午夜在线一区 | 久久久久一区二区三区四区| 久久久一区二区| 欧美成人中文字幕在线| 国产精品vvv| 精品不卡一区| 宅男精品导航| 久久久久久久综合色一本| 欧美精品三级| 国产精品乱看| 亚洲丰满在线| 亚洲欧美卡通另类91av| 欧美aa在线视频| 国产精品区一区| 亚洲国产精品久久久久秋霞影院| 日韩视频在线一区二区三区| 欧美一区二区成人6969| 欧美大片在线观看| 国产三级欧美三级日产三级99| 亚洲国产另类 国产精品国产免费| 亚洲综合色婷婷| 欧美黄色视屏| 国产精品久久久久久久久久三级| 精品福利免费观看| 亚洲一区二区黄| 免费在线看一区| 国产精品福利在线| 亚洲国产精品久久久久婷婷884 | 日韩亚洲不卡在线| 久久久久成人精品免费播放动漫| 欧美精品高清视频| 国外成人在线视频网站| 一区二区三区回区在观看免费视频| 久久久久久久久伊人| 国产精品久久久久高潮| 亚洲激情影院| 久久久久国产精品麻豆ai换脸| 欧美三区在线视频| 亚洲黄色高清| 亚洲欧美日韩在线观看a三区| 欧美激情综合在线| 伊人春色精品| 欧美在线免费观看视频| 久久国产一二区| 国产精品乱码人人做人人爱| 99re6这里只有精品| 久久天天躁狠狠躁夜夜av| 国产精品亚洲不卡a| 一区二区三区四区精品| 欧美激情区在线播放| 亚洲精品少妇| 欧美另类高清视频在线| 亚洲免费观看在线视频| 欧美日韩国产色综合一二三四| 日韩亚洲视频在线| 欧美三区免费完整视频在线观看| 宅男66日本亚洲欧美视频| 欧美视频一区在线| 亚洲精品视频在线观看网站| 欧美一区久久| 韩国欧美国产1区| 久久野战av| 亚洲国产精品一区二区第四页av| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲国产导航| 欧美另类视频在线| 亚洲图片你懂的| 国产欧美日韩不卡免费| 久久成人综合视频| 一区二区在线观看视频| 免费在线欧美黄色| 日韩一级片网址| 国产精品久久久久久久久| 性欧美超级视频| 狠狠色丁香婷婷综合影院| 久久综合999| 日韩视频一区二区| 国产精品二区在线| 欧美一区二区精品在线| 在线精品亚洲一区二区| 欧美激情国产日韩| 亚洲图片你懂的| 国产日韩欧美精品| 欧美大胆成人| 亚洲色在线视频| 国产一区99| 欧美成人a∨高清免费观看| 99视频热这里只有精品免费| 国产精品久久久久一区二区三区共| 欧美一区二区三区免费视频| 在线日本成人| 欧美日本一区二区高清播放视频| 亚洲宅男天堂在线观看无病毒| 国产一区二区中文| 欧美大香线蕉线伊人久久国产精品| 一区二区三区精品视频在线观看| 国产农村妇女毛片精品久久麻豆 | 久久手机免费观看| 亚洲精选视频在线| 国产乱码精品1区2区3区| 久久免费精品视频| 一区二区激情| 韩国一区二区三区美女美女秀| 欧美黑人在线观看| 欧美在线精品免播放器视频| 亚洲精品一区二区在线观看| 国产欧美日韩精品一区| 欧美国产免费| 久久国产成人| avtt综合网| 一区在线播放| 国产精品美女999| 欧美成人亚洲| 欧美在线三级| 日韩视频免费观看| 国内精品一区二区三区| 欧美日韩中文字幕精品| 久久人人九九| 亚洲欧美中文另类| 亚洲精品小视频| 激情久久久久| 国产精品久久久久久久电影| 欧美成人有码| 久久精品国产一区二区三区免费看 | 在线一区二区三区四区| 激情懂色av一区av二区av| 国产精品magnet| 免费欧美高清视频| 欧美专区在线| 在线一区观看| 亚洲丁香婷深爱综合| 国产亚洲aⅴaaaaaa毛片| 欧美日韩免费高清| 欧美a级片网站| 欧美制服丝袜第一页| 亚洲一区二区三区欧美| 日韩午夜在线电影| 亚洲国产一区二区三区高清| 国产亚洲欧美一区| 国产精品乱人伦中文| 欧美精品免费看| 美腿丝袜亚洲色图| 久久精品国产亚洲一区二区三区| 亚洲一区二区欧美| 亚洲理伦在线| 亚洲国产专区校园欧美| 韩国免费一区| 国产亚洲午夜| 国产精品视频免费一区| 欧美三级电影大全| 欧美另类人妖| 欧美成年人视频网站| 久久久欧美精品sm网站| 西西人体一区二区| 亚洲午夜精品在线| 夜夜嗨av色一区二区不卡| 亚洲国产一二三| 亚洲第一精品电影| 影视先锋久久| 激情av一区| 欧美激情中文字幕在线| 欧美成人精品h版在线观看| 久久精品九九| 久久爱另类一区二区小说| 午夜精品福利一区二区蜜股av| 亚洲一区三区在线观看| 亚洲一区二区黄| 亚洲一区视频在线观看视频| 亚洲一区欧美一区| 亚洲尤物在线视频观看| 亚洲在线观看视频| 午夜精品久久久久久久| 亚洲欧美影院| 欧美一区二区大片| 欧美在线看片| 久久成人免费网| 久久久久国产免费免费| 久久欧美肥婆一二区| 久色成人在线|