国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

當前位置:首頁 > 科技  > 軟件

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

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

1 判斷類型

注入的屬性判斷其類型:2u528資訊網——每日最新資訊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注解,如果有該注解那么會創建代理對象,否則返回null            // 總結:如果注入的屬性有@Lazy注解,那么會返回由ProxyFactory對象創建的代理對象            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,繼續獲取是否有@Priority(優先級)注解          // 如果沒有則返回null,如果有則返回值越小的優先級越高(如果有多個優先級一樣,則系統報錯)          // 如果上面都返回的null,那么最后會通過beanName進行匹配          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 判斷集合類型

判斷需要注入的屬性的數據類型是否是如下幾種。2u528資訊網——每日最新資訊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 集合中保存了,容器內置的和自定義注冊的依賴注入對象    //(如:HttpServletRequest對象的注入為該集合內部指定的對象)    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在注入屬性的時候會判斷是什么數據類型進行相應的操作2u528資訊網——每日最新資訊28at.com

完畢!!!2u528資訊網——每日最新資訊28at.com

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

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

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

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

標簽:
  • 熱門焦點
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
久久精品视频网| 成人高清免费在线播放| 国产欧美精品一区二区色综合| 欧美成人video| 久久一日本道色综合| 亚洲高清资源| 亚洲大黄网站| 一区二区三区精品国产| 亚洲欧美日韩精品一区二区| 色噜噜狠狠色综合欧洲selulu| 91久久香蕉国产日韩欧美9色| 欧美日韩一二三| 亚洲综合区在线| 久久久综合视频| 日韩欧美亚洲另类制服综合在线| 国产精品久久福利| 久久99精品久久久久久国产越南| 色综合咪咪久久| 91国产视频在线观看| 国产精品天干天干在观线| 91精品国产免费久久综合| 国产综合亚洲精品一区二| 精品一区二区精品| 国产在线精品一区二区夜色| 捆绑变态av一区二区三区| 午夜一区二区三区在线观看| 亚洲国产精品自拍| 亚洲www啪成人一区二区麻豆| 亚洲国产欧美另类丝袜| 日韩黄色小视频| 免费精品视频在线| 免费精品视频在线| 国产91清纯白嫩初高中在线观看| 激情六月婷婷久久| aa级大片欧美| 最新国产拍偷乱拍精品| 免费观看在线色综合| 亚洲一区在线观看免费| 日韩高清电影一区| 9i在线看片成人免费| 欧美色视频一区| 国产午夜亚洲精品羞羞网站| 免费一级片91| 亚洲精品视频啊美女在线直播| 欧美日韩国产高清一区二区三区| 欧美国产一区二区| 久久99深爱久久99精品| 亚洲国产免费| 久久精品视频免费| 亚洲黄色av| 91精品国产综合久久精品 | 精品免费日韩av| 国产精品美女久久久久久久 | 欧美在线一二三四区| 国产精品国产精品国产专区不片| 黄页网站大全一区二区| 欧美亚洲三级| 亚洲精品综合在线| 欧美不卡在线| 欧美mv和日韩mv国产网站| 麻豆精品视频在线观看免费 | 一区免费在线| 国产精品家庭影院| 97精品超碰一区二区三区| 精品美女被调教视频大全网站| 精品999成人| 欧美亚洲另类激情小说| 免费人成黄页网站在线一区二区| 国产乱人伦精品一区二区 | 青草av.久久免费一区| 欧美综合色免费| 91精品国产综合久久久久久久| 亚洲私人黄色宅男| 美女亚洲精品| 成人美女视频在线观看| 18涩涩午夜精品.www| 久久精品国产第一区二区三区最新章节 | 91麻豆免费视频| 一区二区三区四区亚洲| 欧美色精品在线视频| 欧美日韩一区二区高清| 2023国产精品| 国产jizzjizz一区二区| 欧美精品乱码久久久久久按摩| 国产福利精品一区二区| 国产女人18水真多18精品一级做| 99热在线精品观看| 美洲天堂一区二卡三卡四卡视频| 在线不卡一区二区| 亚洲国产激情| 美国毛片一区二区三区| 久久久综合网站| 欧美大白屁股肥臀xxxxxx| av亚洲产国偷v产偷v自拍| 中文字幕日韩av资源站| 欧美日韩一本到| 国内精品久久久久久久97牛牛| 午夜精品久久久久久久99水蜜桃| 91精品国产综合久久婷婷香蕉 | 精品一区二区免费| 亚洲欧洲制服丝袜| 欧美日本乱大交xxxxx| 在线看片欧美| 成人午夜在线免费| 午夜免费欧美电影| 国产精品美女一区二区| 制服丝袜在线91| 久久综合影音| 亚洲高清123| 成人黄页在线观看| 久久精品国产精品亚洲红杏| 亚洲天堂成人在线观看| 久久综合久久鬼色| 精品视频在线免费| 免费日韩av片| 亚洲精品国产精品国自产观看| 成人精品视频.| 国产一区二区h| 国产一区欧美二区| 久久66热偷产精品| 免费观看30秒视频久久| 亚洲日本青草视频在线怡红院| 久久久久久国产精品mv| 91在线视频播放地址| 欧美高清视频一区| 影音先锋在线一区| 久久综合九色综合久99| 在线观看成人免费视频| 欧美精品高清视频| 久久久精品黄色| 国产精品成人网| 亚洲一区二区在线免费观看视频| 国产精品国产三级国产aⅴ原创| 一区二区高清视频在线观看| 日本午夜精品视频在线观看| 国产精品亚洲一区二区三区在线 | 欧美日韩一区二区三区四区在线观看 | 在线成人午夜影院| 自拍偷拍亚洲综合| 精品影视av免费| 欧美精品一区二区三区久久久竹菊| 一区二区三区国产盗摄| 欧美日韩日日夜夜| 亚洲欧洲国产日本综合| 日本不卡一二三| 久久久一二三| 日韩欧美精品在线视频| 亚洲乱码一区二区三区在线观看| 久久91精品久久久久久秒播| 亚洲无线视频| 欧美猛男男办公室激情| 国产精品成人午夜| 成人夜色视频网站在线观看| 国产精品外国| 久久天天做天天爱综合色| 日本不卡一区二区| 伊人色综合久久天天五月婷| 日韩一区二区中文字幕| 亚洲成人先锋电影| 亚洲高清二区| 色先锋资源久久综合| 久久久久久亚洲精品杨幂换脸| 精品久久国产老人久久综合| 亚洲精品美国一| www.亚洲人| 色婷婷久久久亚洲一区二区三区| 久久久久久久久久久久久夜| 秋霞影院一区二区| 欧美日本精品| 欧美一区日本一区韩国一区| 一区二区三区高清不卡| 99精品热视频| 欧美色精品天天在线观看视频| 综合久久久久久| www.66久久| 91精品国产一区二区三区| 亚洲午夜精品在线| 精品电影一区| 久久精品视频一区| 成人免费看的视频| 欧美日韩一区二区在线视频| 午夜免费欧美电影| 在线观看一区二区精品视频| 91精品福利在线| 美女一区二区视频| 蜜桃av久久久亚洲精品| 伊人开心综合网| 99精品免费| 亚洲精选一二三| 国产精品一区视频网站| ㊣最新国产の精品bt伙计久久| 国外成人免费视频| 1区2区3区精品视频| 亚洲黄页一区| 亚洲伦理在线精品| 久久国产精品99国产| 久久99久久精品| 日韩欧美成人一区二区| 欧美日一区二区在线观看| 欧美国产日韩精品免费观看|