玩家必看科普!麻豆人人妻人人妻人人片AV,欧美老妇交乱视频在线观看,久久综合九色综合久99_知乎
<ruby id="fgcka"></ruby>
  • <progress id="fgcka"></progress>
    <tbody id="fgcka"></tbody>
    <dd id="fgcka"></dd>

    1. <dd id="fgcka"></dd>

      <em id="fgcka"></em>
        1. 系統城裝機大師 - 固鎮縣祥瑞電腦科技銷售部宣傳站!

          當前位置:首頁 > 網絡編程 > JavaScript > 詳細頁面

          Spring populateBean屬性賦值和自動注入

          時間:2023-03-15來源:系統城裝機大師作者:佚名

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
          49
          50
          51
          52
          53
          54
          55
          56
          57
          58
          59
          60
          61
          62
          63
          64
          65
          66
          67
          68
          69
          70
          71
          72
          73
          74
          75
          76
          77
          78
          79
          80
          81
          82
          83
          84
          85
          86
          protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
             if (bw == null) {
                if (mbd.hasPropertyValues()) {
                   throw new BeanCreationException(
                         mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
                }
                else {
                   // Skip property population phase for null instance.
                   return;
                }
             }
             // Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
             // state of the bean before properties are set. This can be used, for example,
             // to support styles of field injection.
             //一、修改Bean實例
             //給InstantiationAwareBeanPostProcessors最后一個機會在屬性設置前改變bean
             // 具體通過調用ibp.postProcessAfterInstantiation方法,如果調用返回false,表示不必繼續進行依賴注入,直接返回
             if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
                for (BeanPostProcessor bp : getBeanPostProcessors()) {
                   if (bp instanceof InstantiationAwareBeanPostProcessor) {
                      InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                      //返回值為true則繼續填充bean
                      if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                         return;
                      }
                   }
                }
             }
             PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
              // 根據bean的依賴注入方式:即是否標注有 @Autowired 注解或 autowire=“byType/byName” 的標簽
             // 會遍歷bean中的屬性,根據類型或名稱來完成相應的注入
             int resolvedAutowireMode = mbd.getResolvedAutowireMode();
             if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
                MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
                // Add property values based on autowire by name if applicable.
                //二、根據名稱自動注入
                if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
                   autowireByName(beanName, mbd, bw, newPvs);
                }
                // Add property values based on autowire by type if applicable.
                //三、根據類型自動注入
                if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
                   autowireByType(beanName, mbd, bw, newPvs);
                }
                pvs = newPvs;
             }
              // 容器是否注冊了InstantiationAwareBeanPostProcessor
             boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
             // 是否進行依賴檢查
             boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
             PropertyDescriptor[] filteredPds = null;
             if (hasInstAwareBpps) {
                if (pvs == null) {
                   pvs = mbd.getPropertyValues();
                }
                for (BeanPostProcessor bp : getBeanPostProcessors()) {
                   if (bp instanceof InstantiationAwareBeanPostProcessor) {
                      InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                      PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
                      if (pvsToUse == null) {
                         if (filteredPds == null) {
                            filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                         }
                         //對所有需要依賴檢查的屬性進行后處理
                         //四、處理屬性值(@Autowired、@Value)
                         pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
                         if (pvsToUse == null) {
                            return;
                         }
                      }
                      pvs = pvsToUse;
                   }
                }
             }
             // 檢查是否滿足相關依賴關系,對應的depends-on屬性,3.0后已棄用
             if (needsDepCheck) {
                if (filteredPds == null) {
                   filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                }
                checkDependencies(beanName, mbd, filteredPds, pvs);
             }
             // 五、填充屬性
             if (pvs != null) {
                applyPropertyValues(beanName, mbd, bw, pvs);
             }
          }

          一、postProcessAfterInstantiation:修改Bean實例

          在填充屬性之前調用postProcessAfterInstantiation修改Bean定義信息

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
             for (BeanPostProcessor bp : getBeanPostProcessors()) {
                if (bp instanceof InstantiationAwareBeanPostProcessor) {
                   InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                   if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                      return;
                   }
                }
             }
          }

          二、autowireByName:根據名稱自動注入

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          protected void autowireByName(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
              //尋找bw中需要依賴注入的屬性
              String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
              for (String propertyName : propertyNames) {
                  //檢查緩存bean中是否存在當前bean
                  if (containsBean(propertyName)) {
                      //遞歸初始化相關的bean. 代碼(1)
                      Object bean = getBean(propertyName);
                      pvs.add(propertyName, bean);
                      //注冊依賴
                      registerDependentBean(propertyName, beanName);
                      if (logger.isTraceEnabled()) {
                          logger.trace("Added autowiring by name from bean name '" + beanName +
                                  "' via property '" + propertyName + "' to bean named '" + propertyName + "'");
                      }
                  } else {
                      // 找不到則不處理
                      if (logger.isTraceEnabled()) {
                          logger.trace("Not autowiring property '" + propertyName + "' of bean '" + beanName +
                                  "' by name: no matching bean found");
                      }
                  }
              }
          }

          三、autowireByType:根據類型自動注入

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          protected void autowireByType(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
              // 獲取自定義的類型轉換器
              TypeConverter converter = getCustomTypeConverter();
              if (converter == null) {
                  converter = bw;
              }
              Set<String> autowiredBeanNames = new LinkedHashSet<>(4);
              //尋找bw中需要依賴注入的屬性
              String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
              for (String propertyName : propertyNames) {
                  try {
                      // 獲取屬性描述符
                      PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName);
                      //不要嘗試按類型為Object類型自動裝配:即使從技術上講是不滿意的,非簡單的屬性,也沒有意義。
                      if (Object.class != pd.getPropertyType()) {
                          //探測指定屬性的set方法
                          MethodParameter methodParam = BeanUtils.getWriteMethodParameter(pd);
                          // Do not allow eager init for type matching in case of a prioritized post-processor.
                          boolean eager = !PriorityOrdered.class.isInstance(bw.getWrappedInstance());
                          DependencyDescriptor desc = new AutowireByTypeDependencyDescriptor(methodParam, eager);
                          //解析指定beanName的屬性所匹配的值,并把解析到的屬性名稱存儲在autowiredBeanNames中,當屬性存在多個封裝bean時
                          //比如: @Autowired private List<A> aList; 就會找到所有匹配A類型的bean并將其注入
                          Object autowiredArgument = resolveDependency(desc, beanName, autowiredBeanNames, converter);
                          if (autowiredArgument != null) {
                              // 添加到待注入的bean列表中
                              pvs.add(propertyName, autowiredArgument);
                          }
                          for (String autowiredBeanName : autowiredBeanNames) {
                              //注冊依賴
                              registerDependentBean(autowiredBeanName, beanName);
                              if (logger.isTraceEnabled()) {
                                  logger.trace("Autowiring by type from bean name '" + beanName + "' via property '" +
                                          propertyName + "' to bean named '" + autowiredBeanName + "'");
                              }
                          }
                          autowiredBeanNames.clear();
                      }
                  } catch (BeansException ex) {
                      throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, propertyName, ex);
                  }
              }
          }

          四、postProcessPropertyValues:處理屬性值(@Resource、@Autowired、@Value)

          CommonAnnotationBeanPostProcessor:處理@Resource

          AutowiredAnnotationBeanPostProcessor:處理@Autowired、@Value。

          詳情:https://www.jb51.net/article/277330.htm

          五、applyPropertyValues:填充屬性

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
          49
          50
          51
          52
          53
          54
          55
          56
          57
          58
          59
          60
          61
          62
          63
          64
          65
          66
          67
          68
          69
          70
          71
          72
          73
          74
          75
          76
          77
          78
          79
          80
          81
          82
          83
          84
          85
          86
          87
          protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {
              if (pvs.isEmpty()) {
                  return;
              }
              if (System.getSecurityManager() != null && bw instanceof BeanWrapperImpl) {
                  ((BeanWrapperImpl) bw).setSecurityContext(getAccessControlContext());
              }
              MutablePropertyValues mpvs = null;
              List<PropertyValue> original;
              if (pvs instanceof MutablePropertyValues) {
                  mpvs = (MutablePropertyValues) pvs;
                  //如果mpvs中的值已經被轉換為對應的類型那么可以直接設置到beanWrapper
                  if (mpvs.isConverted()) {
                      // Shortcut: use the pre-converted values as-is.
                      try {
                          bw.setPropertyValues(mpvs);
                          return;
                      } catch (BeansException ex) {
                          throw new BeanCreationException(
                                  mbd.getResourceDescription(), beanName, "Error setting property values", ex);
                      }
                  }
                  original = mpvs.getPropertyValueList();
              } else {
                  //如果pvs并不是使用MutablePropertyValues封裝的類型,那么直接使用原始的屬性獲取方法
                  original = Arrays.asList(pvs.getPropertyValues());
              }
              TypeConverter converter = getCustomTypeConverter();
              if (converter == null) {
                  converter = bw;
              }
              //獲取對應的解析器
              BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);
              // Create a deep copy, resolving any references for values.
              List<PropertyValue> deepCopy = new ArrayList<>(original.size());
              boolean resolveNecessary = false;
              //遍歷屬性,將屬性轉換為對應屬性的類型
              for (PropertyValue pv : original) {
                  if (pv.isConverted()) {
                      deepCopy.add(pv);
                  } else {
                      String propertyName = pv.getName();
                      Object originalValue = pv.getValue();
                      if (originalValue == AutowiredPropertyMarker.INSTANCE) {
                          Method writeMethod = bw.getPropertyDescriptor(propertyName).getWriteMethod();
                          if (writeMethod == null) {
                              throw new IllegalArgumentException("Autowire marker for property without write method: " + pv);
                          }
                          originalValue = new DependencyDescriptor(new MethodParameter(writeMethod, 0), true);
                      }
                      //解析、注入值
                      Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);
                      Object convertedValue = resolvedValue;
                      boolean convertible = bw.isWritableProperty(propertyName) &&
                              !PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);
                      if (convertible) {
                          convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter);
                      }
                      // Possibly store converted value in merged bean definition,
                      // in order to avoid re-conversion for every created bean instance.
                      if (resolvedValue == originalValue) {
                          if (convertible) {
                              pv.setConvertedValue(convertedValue);
                          }
                          deepCopy.add(pv);
                      } else if (convertible && originalValue instanceof TypedStringValue &&
                              !((TypedStringValue) originalValue).isDynamic() &&
                              !(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))) {
                          pv.setConvertedValue(convertedValue);
                          deepCopy.add(pv);
                      } else {
                          resolveNecessary = true;
                          deepCopy.add(new PropertyValue(pv, convertedValue));
                      }
                  }
              }
              if (mpvs != null && !resolveNecessary) {
                  mpvs.setConverted();
              }
              // Set our (possibly massaged) deep copy.
              try {
                  bw.setPropertyValues(new MutablePropertyValues(deepCopy));
              } catch (BeansException ex) {
                  throw new BeanCreationException(
                          mbd.getResourceDescription(), beanName, "Error setting property values", ex);
              }
          }

          解析、注入值

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
          49
          50
          51
          52
          53
          54
          55
          56
          57
          58
          59
          60
          61
          62
          63
          64
          65
          66
          67
          68
          69
          70
          71
          72
          73
          74
          75
          76
          77
          78
          79
          80
          81
          82
          83
          84
          85
          86
          87
          88
          89
          90
          91
          92
          93
          94
          95
          96
          97
          98
          99
          100
          101
          102
          103
          104
          105
          106
          107
          108
          109
          110
          111
          112
          113
          114
          115
          116
          117
          118
          119
          120
          public Object resolveValueIfNecessary(Object argName, @Nullable Object value) {
              // We must check each value to see whether it requires a runtime reference
              // to another bean to be resolved.
              // 5.1 解析引用
              if (value instanceof RuntimeBeanReference) {
                  RuntimeBeanReference ref = (RuntimeBeanReference) value;
                  return resolveReference(argName, ref);
              }
              // 如果根據另一個Bean的name進行依賴,進入下面的分支
              else if (value instanceof RuntimeBeanNameReference) {
                  String refName = ((RuntimeBeanNameReference) value).getBeanName();
                  refName = String.valueOf(doEvaluate(refName));
                  if (!this.beanFactory.containsBean(refName)) {
                      throw new BeanDefinitionStoreException(
                              "Invalid bean name '" + refName + "' in bean reference for " + argName);
                  }
                  return refName;
              }
              // 解析BeanDefinitionHolder
              else if (value instanceof BeanDefinitionHolder) {
                  // Resolve BeanDefinitionHolder: contains BeanDefinition with name and aliases.
                  BeanDefinitionHolder bdHolder = (BeanDefinitionHolder) value;
                  return resolveInnerBean(argName, bdHolder.getBeanName(), bdHolder.getBeanDefinition());
              }
              // 解析純BeanDefinition
              else if (value instanceof BeanDefinition) {
                  // Resolve plain BeanDefinition, without contained name: use dummy name.
                  BeanDefinition bd = (BeanDefinition) value;
                  String innerBeanName = "(inner bean)" + BeanFactoryUtils.GENERATED_BEAN_NAME_SEPARATOR +
                          ObjectUtils.getIdentityHexString(bd);
                  return resolveInnerBean(argName, innerBeanName, bd);
              }
              // 解析數組
              else if (value instanceof ManagedArray) {
                  // May need to resolve contained runtime references.
                  ManagedArray array = (ManagedArray) value;
                  Class<?> elementType = array.resolvedElementType;
                  if (elementType == null) {
                      String elementTypeName = array.getElementTypeName();
                      if (StringUtils.hasText(elementTypeName)) {
                          try {
                              elementType = ClassUtils.forName(elementTypeName, this.beanFactory.getBeanClassLoader());
                              array.resolvedElementType = elementType;
                          }
                          catch (Throwable ex) {
                              // Improve the message by showing the context.
                              throw new BeanCreationException(
                                      this.beanDefinition.getResourceDescription(), this.beanName,
                                      "Error resolving array type for " + argName, ex);
                          }
                      }
                      else {
                          elementType = Object.class;
                      }
                  }
                  return resolveManagedArray(argName, (List<?>) value, elementType);
              }
              //5.2解析List
              else if (value instanceof ManagedList) {
                  // May need to resolve contained runtime references.
                  return resolveManagedList(argName, (List<?>) value);
              }
              // 解析Set
              else if (value instanceof ManagedSet) {
                  // May need to resolve contained runtime references.
                  return resolveManagedSet(argName, (Set<?>) value);
              }
              // 解析Map
              else if (value instanceof ManagedMap) {
                  // May need to resolve contained runtime references.
                  return resolveManagedMap(argName, (Map<?, ?>) value);
              }
              // 解析Properties
              else if (value instanceof ManagedProperties) {
                  Properties original = (Properties) value;
                  Properties copy = new Properties();
                  original.forEach((propKey, propValue) -> {
                      if (propKey instanceof TypedStringValue) {
                          propKey = evaluate((TypedStringValue) propKey);
                      }
                      if (propValue instanceof TypedStringValue) {
                          propValue = evaluate((TypedStringValue) propValue);
                      }
                      if (propKey == null || propValue == null) {
                          throw new BeanCreationException(
                                  this.beanDefinition.getResourceDescription(), this.beanName,
                                  "Error converting Properties key/value pair for " + argName + ": resolved to null");
                      }
                      copy.put(propKey, propValue);
                  });
                  return copy;
              }
              // 解析String
              else if (value instanceof TypedStringValue) {
                  // Convert value to target type here.
                  TypedStringValue typedStringValue = (TypedStringValue) value;
                  Object valueObject = evaluate(typedStringValue);
                  try {
                      Class<?> resolvedTargetType = resolveTargetType(typedStringValue);
                      if (resolvedTargetType != null) {
                          return this.typeConverter.convertIfNecessary(valueObject, resolvedTargetType);
                      }
                      else {
                          return valueObject;
                      }
                  }
                  catch (Throwable ex) {
                      // Improve the message by showing the context.
                      throw new BeanCreationException(
                              this.beanDefinition.getResourceDescription(), this.beanName,
                              "Error converting typed String value for " + argName, ex);
                  }
              }
              else if (value instanceof NullBean) {
                  return null;
              }
              else {
                  return evaluate(value);
              }
          }

          5.1 解析依賴

          核心還是getBean方法!開始觸發關聯創建Bean

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          private Object resolveReference(Object argName, RuntimeBeanReference ref) {
              try {
                  Object bean;
                  // 獲取BeanName
                  String refName = ref.getBeanName();
                  refName = String.valueOf(doEvaluate(refName));
                  // 如果Bean在父容器,則去父容器取
                  if (ref.isToParent()) {
                      if (this.beanFactory.getParentBeanFactory() == null) {
                          throw new BeanCreationException(
                                  this.beanDefinition.getResourceDescription(), this.beanName,
                                  "Can't resolve reference to bean '" + refName +
                                          "' in parent factory: no parent factory available");
                      }
                      bean = this.beanFactory.getParentBeanFactory().getBean(refName);
                  }
                  else {
                      // 在本容器,調用getBean
                      bean = this.beanFactory.getBean(refName);
                      this.beanFactory.registerDependentBean(refName, this.beanName);
                  }
                  if (bean instanceof NullBean) {
                      bean = null;
                  }
                  return bean;
              }
              catch (BeansException ex) {
                  throw new BeanCreationException(
                          this.beanDefinition.getResourceDescription(), this.beanName,
                          "Cannot resolve reference to bean '" + ref.getBeanName() + "' while setting " + argName, ex);
              }
          }

          5.2 解析List

          直接把 List 集合塞入屬性中即可。

          1
          2
          3
          4
          5
          6
          7
          private List<?> resolveManagedList(Object argName, List<?> ml) {
              List<Object> resolved = new ArrayList<>(ml.size());
              for (int i = 0; i < ml.size(); i++) {
                  resolved.add(resolveValueIfNecessary(new KeyedArgName(argName, i), ml.get(i)));
              }
              return resolved;
          }

          以上就是Spring populateBean屬性賦值和自動注入的詳細內容

          分享到:

          相關信息

          系統教程欄目

          欄目熱門教程

          人氣教程排行

          站長推薦

          熱門系統下載

          玩家必看科普!麻豆人人妻人人妻人人片AV,欧美老妇交乱视频在线观看,久久综合九色综合久99_知乎 人人玩人人添人人澡超碰偷拍 青春娱乐视频精品分类官网2 最好最新高清中文字幕 91国自产拍最新2018 欧美精品一区二区三区不卡网 深夜你懂得我的意思2021 宿舍NP乖把腿张开H 网恋奔现一天被要几次 为什么我越叫他越快 学渣各种各样的PLAY 英语课代表下面好软小说 亚洲国产综合在线区尤物 FREE性丰满HD性欧美 我年轻漂亮的继坶BD 最近中文字幕完整免费视频 啦啦啦免费视频卡一卡二 青柠视频在线观看大全 在线天堂WWW在线资源 亚洲国产日本韩国欧美MV 天天学习|久久久久久久精品国产亚洲87 国产K频道分享系统进入口 三个嘴都吃满了还塞满了 JAPONENSIS老师学生JAVAHBB 亚洲精品1卡2卡3卡4卡 樱花草在线社区WWW韩国 好涨水快流出来了快吃动视频 久久AV无码精品人妻出轨