AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

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

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

1 判斷類型

注入的屬性判斷其類型:6m428資訊網——每日最新資訊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 判斷集合類型

判斷需要注入的屬性的數據類型是否是如下幾種。6m428資訊網——每日最新資訊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在注入屬性的時候會判斷是什么數據類型進行相應的操作6m428資訊網——每日最新資訊28at.com

完畢!!!6m428資訊網——每日最新資訊28at.com

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

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

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

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

標簽:
  • 熱門焦點
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • 一文看懂為蘋果Vision Pro開發應用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現實(MR)頭戴設備。Vision Pro結合了虛擬現實(VR)和增強現實(AR)的沉浸感。其高分辨率顯示屏、先進的傳感器和強大的處理能力
  • 學習JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當你決心學習一門語言的時候,很難選擇到底應該學習哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數或類的行為。裝飾器本質上是一個函數,它接受另一個函數或類作為參數,并返回一個新的函數或類。它們通常用
  • AI芯片初創公司Tenstorrent獲三星和現代1億美元投資

    Tenstorrent是一家由芯片行業資深人士Jim Keller領導的加拿大初創公司,專注于開發人工智能芯片,該公司周三表示,已經從現代汽車集團和三星投資基金等
  • 2299元起!iQOO Pad明晚首銷:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發布會,除了首發安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發布會上推出了旗下首款平板電腦——iQOO Pad,其最大的賣點
  • OPPO K11搭載長壽版100W超級閃充:26分鐘充滿100%

    據此前官方宣布,OPPO將于7月25日也就是今天下午14:30舉辦新品發布會,屆時全新的OPPO K11將正式與大家見面,將主打旗艦影像,和同檔位競品相比,其最大的賣
  • OPPO K11采用全方位護眼屏:三大護眼能力減輕視覺疲勞

    日前OPPO官方宣布,全新的OPPO K11將于7月25日正式發布,將主打旗艦影像,和同檔位競品相比,其最大的賣點就是將配備索尼IMX890主攝,堪稱是2000檔位影像表
  • “買真退假” 這種“羊毛”不能薅

    □ 法治日報 記者 王春   □ 本報通訊員 胡佳麗  2020年初,還在上大學的小東加入了一個大學生兼職QQ群。群主&ldquo;七王&rdquo;在群里介紹一些刷單賺
Top