在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    Spring注入屬性時到底都能注入什么樣的數(shù)據(jù)類型你都知道嗎?

    1 判斷類型

    注入的屬性判斷其類型:

    OptionalObjectFactoryObjectProviderjavax.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 // 總結:如果注入的屬性有@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進行匹配 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ù)類型是否是如下幾種。

    StreamDependencyDescriptorArrayCollectionMap

    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在注入屬性的時候會判斷是什么數(shù)據(jù)類型進行相應的操作

    完畢?。?!

    公眾:SpringBoot Cloud實戰(zhàn)案例錦集

    Spring Retry重試框架的應用

    SpringBoot WebFlux整合Spring Security進行權限認證

    Spring MVC 異常處理方式 Spring事務實現(xiàn)原理源碼分析

    Spring容器這些擴展點你都清楚了嗎?

    Spring 自定義Advisor以編程的方式實現(xiàn)AOP

    SpringBoot郵件發(fā)送示例

    SpringBoot多數(shù)據(jù)源配置詳解

    SpringBoot配置文件你了解多少?

    在Spring Cloud 中你還在使用Ribbon快來試試Load-Balancer

    Spring注入屬性時到底都能注入什么樣的數(shù)據(jù)類型你都知道嗎?

    Spring注入屬性時到底都能注入什么樣的數(shù)據(jù)類型你都知道嗎?

    Spring注入屬性時到底都能注入什么樣的數(shù)據(jù)類型你都知道嗎?

    Spring注入屬性時到底都能注入什么樣的數(shù)據(jù)類型你都知道嗎?

    鄭重聲明:本文內容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權歸原作者所有,如有侵權請聯(lián)系管理員(admin#wlmqw.com)刪除。
    用戶投稿
    上一篇 2022年6月28日 15:01
    下一篇 2022年6月28日 15:01

    相關推薦

    • 京東店鋪類型有哪些京東入駐有什么資質要求

      今天的互聯(lián)網(wǎng)發(fā)展迅速,讓傳統(tǒng)企業(yè)有了更多選擇,但也同樣也對剛觸網(wǎng)的商家增添了許多迷茫,近日知舟電商就收到很多商家朋友詢問京東入駐相關問題,今天知舟君就給大家分享下。 一.京東入駐準…

      2022年11月18日
    • 怎么刪除自己的追評(淘寶追評可以刪除嗎)

      一、淘寶店鋪每個評價類型的處理方案都是不同的,那具體哪些評價類型該如何區(qū)分呢? 1、主評為好評時:不支持修改或者刪除評價的,若中評/差評改為好評,也不可修改或刪除 ; 2、當主評為…

      2022年11月17日
    • 排名前十的小說(排名前十的小說完結)

      本文主要講的是排名前十的小說,以及和排名前十的小說完結相關的知識,如果覺得本文對您有所幫助,不要忘了將本文分享給朋友。 小說排行榜2022前十名完結(十大必看網(wǎng)絡小說排行榜每本都是…

      2022年11月14日
    • 《魔獸世界》10.0釣魚點分布大全 10.0最佳釣魚地點推薦

      魔獸世界10.0釣魚點分布位置在哪?很多玩家還不清楚有哪些地方釣魚比較方便的,其實釣魚方便的地方有很多,下面一起來看一下小編帶來的魔獸世界10.0釣魚點分布大全。希望可以幫助各位玩…

      2022年11月8日
    • 小紅書怎么開通店鋪(小紅書店鋪)

      如何判斷自己能不能在小紅書中開店呢?今天我們就來分享一下,都有哪些類型的店鋪可以在小紅書中開店,以及開店之后,可以售賣哪些商品。 目前,小紅書平臺是可以開設個人店的,但是如果你想開…

      2022年11月8日
    • 夢幻轉服查詢(夢幻轉服查詢平轉公眾號)

      大家好,我是熱愛生活熱愛夢幻,一個夢幻西游15年的老玩家,帶你從小白五開進階五開大神! 周一活動(妙手仁心) 活動時間:每周一下午15:00~17:30。 條件:≥20級≥3人。 …

      2022年11月2日
    • 邀您一起見證11位女性編碼藝術家和藝術編碼家生成綻放(一起見證公司的發(fā)展)

      Chamcha是以NFT為中心的的區(qū)塊鏈線上交易所,始創(chuàng)把NFT做到全網(wǎng)全鏈。Chamcha交易所里面用戶可以通過相對比較簡單的方式入門NFT,包括用信用卡或USDC穩(wěn)定幣就可以購…

      2022年11月2日
    • 萬圣節(jié)發(fā)紅包應該發(fā)多少錢(萬圣節(jié)發(fā)紅包應該發(fā)多少合適)

      一年一度的萬圣節(jié)就要到了,近年來非常受歡迎,不少人都會在節(jié)假日給對象和朋友發(fā)紅包,但是發(fā)紅包的數(shù)字也是有講究的的,不少小伙伴在問萬圣節(jié)發(fā)紅包應該發(fā)多少錢?下面小編為大家?guī)砣f圣節(jié)發(fā)…

      2022年10月31日
    • 哪些平臺可以免費開店(有哪些網(wǎng)站可以開店)

      作為工作之余的副業(yè)小生意,能省則??!同樣是開網(wǎng)店,能免費開一家小網(wǎng)店就很不錯!今天就來盤點一下可以免費開店的平臺,幫大家實現(xiàn)0元當掌柜的小目標! 1、眾所周知的電商界老大淘寶網(wǎng),就…

      2022年10月31日
    • 微信支付如何設置延遲到賬(新版微信延遲轉賬在哪里設置)

      有人說和發(fā)紅包沒什么區(qū)別,區(qū)別還是有的,我們給一個好友發(fā)微信紅包過去,如果發(fā)錯了金額或對象的話,那么對方是收紅包界面是沒有退還給你的選項的,但是轉賬卻有。本期微信隱藏功能:微信轉賬…

      2022年10月29日

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時間:周一至周五,10:30-18:30,節(jié)假日休息