Spring源码解析——IOC属性填充

打印 上一主题 下一主题

主题 899|帖子 899|积分 2697

正文
doCreateBean() 主要用于完成 bean 的创建和初始化工作,我们可以将其分为四个过程:
最全面的Java面试网站


  • createBeanInstance() 实例化 bean
  • populateBean() 属性填充
  • 循环依赖的处理
  • initializeBean() 初始化 bean
第一个过程实例化 bean在前面一篇博客中已经分析完了,这篇博客开始分析 属性填充,也就是 populateBean()
  1. protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {  
  2.     PropertyValues pvs = mbd.getPropertyValues();  
  3.     if (bw == null) {  
  4.         if (!pvs.isEmpty()) {  
  5.             throw new BeanCreationException(  
  6.                     mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");  
  7.         }  
  8.         else {  
  9.             // Skip property population phase for null instance.  
  10.             return;  
  11.         }  
  12.     }  
  13.     // Give any InstantiationAwareBeanPostProcessors the opportunity to modify the  
  14.     // state of the bean before properties are set. This can be used, for example,  
  15.     // to support styles of field injection.  
  16.     boolean continueWithPropertyPopulation = true;  
  17.     if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {  
  18.         for (BeanPostProcessor bp : getBeanPostProcessors()) {  
  19.             if (bp instanceof InstantiationAwareBeanPostProcessor) {  
  20.                 InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;  
  21.                 //返回值为是否继续填充bean  
  22.                 if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {  
  23.                     continueWithPropertyPopulation = false;  
  24.                     break;  
  25.                 }  
  26.             }  
  27.         }  
  28.     }  
  29.     //如果后处理器发出停止填充命令则终止后续的执行  
  30.     if (!continueWithPropertyPopulation) {  
  31.         return;  
  32.     }  
  33.     if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||  
  34.             mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {  
  35.         MutablePropertyValues newPvs = new MutablePropertyValues(pvs);  
  36.         // Add property values based on autowire by name if applicable.  
  37.         //根据名称自动注入  
  38.         if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {  
  39.             autowireByName(beanName, mbd, bw, newPvs);  
  40.         }  
  41.         // Add property values based on autowire by type if applicable.  
  42.         //根据类型自动注入  
  43.         if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {  
  44.             autowireByType(beanName, mbd, bw, newPvs);  
  45.         }  
  46.         pvs = newPvs;  
  47.     }  
  48.     //后处理器已经初始化  
  49.     boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();  
  50.     //需要依赖检查  
  51.     boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE);  
  52.     if (hasInstAwareBpps || needsDepCheck) {  
  53.         PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);  
  54.         if (hasInstAwareBpps) {  
  55.             for (BeanPostProcessor bp : getBeanPostProcessors()) {  
  56.                 if (bp instanceof InstantiationAwareBeanPostProcessor) {  
  57.                     InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;  
  58.                     //对所有需要依赖检查的属性进行后处理  
  59.                     pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);  
  60.                     if (pvs == null) {  
  61.                         return;  
  62.                     }  
  63.                 }  
  64.             }  
  65.         }  
  66.         if (needsDepCheck) {  
  67.             //依赖检查,对应depends-on属性,3.0已经弃用此属性  
  68.             checkDependencies(beanName, mbd, filteredPds, pvs);  
  69.         }  
  70.     }  
  71.     //将属性应用到bean中  
  72.     //将所有ProtertyValues中的属性填充至BeanWrapper中。  
  73.     applyPropertyValues(beanName, mbd, bw, pvs);  
  74. }
复制代码
我们来分析下populateBean的流程:
(1)首先进行属性是否为空的判断
(2)通过调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)方法来控制程序是否继续进行属性填充
(3)根据注入类型(byName/byType)提取依赖的bean,并统一存入PropertyValues中
(4)应用InstantiationAwareBeanPostProcessor的postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName)方法,对属性获取完毕填充前的再次处理,典型的应用是RequiredAnnotationBeanPostProcesser类中对属性的验证
(5)将所有的PropertyValues中的属性填充至BeanWrapper中
上面步骤中有几个地方是我们比较感兴趣的,它们分别是依赖注入(autowireByName/autowireByType)以及属性填充,接下来进一步分析这几个功能的实现细节
分享一份大彬精心整理的大厂面试手册,包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等高频面试题,非常实用,有小伙伴靠着这份手册拿过字节offer~


需要的小伙伴可以自行下载
http://mp.weixin.qq.com/s?__biz=Mzg2OTY1NzY0MQ==&mid=2247485445&idx=1&sn=1c6e224b9bb3da457f5ee03894493dbc&chksm=ce98f543f9ef7c55325e3bf336607a370935a6c78dbb68cf86e59f5d68f4c51d175365a189f8#rd
自动注入

Spring 会根据注入类型( byName / byType )的不同,调用不同的方法(autowireByName() / autowireByType())来注入属性值。
autowireByName()
  1. protected void autowireByName(
  2.         String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
  3.     // 获取 Bean 对象中非简单属性
  4.     String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
  5.     for (String propertyName : propertyNames) {
  6.         // 如果容器中包含指定名称的 bean,则将该 bean 注入到 bean中
  7.         if (containsBean(propertyName)) {
  8.             // 递归初始化相关 bean
  9.             Object bean = getBean(propertyName);
  10.             // 为指定名称的属性赋予属性值  
  11.             pvs.add(propertyName, bean);
  12.             // 属性依赖注入
  13.             registerDependentBean(propertyName, beanName);
  14.             if (logger.isDebugEnabled()) {
  15.                 logger.debug("Added autowiring by name from bean name '" + beanName +
  16.                         "' via property '" + propertyName + "' to bean named '" + propertyName + "'");
  17.             }
  18.         }
  19.         else {
  20.             if (logger.isTraceEnabled()) {
  21.                 logger.trace("Not autowiring property '" + propertyName + "' of bean '" + beanName +
  22.                         "' by name: no matching bean found");
  23.             }
  24.         }
  25.     }
  26. }
复制代码
该方法逻辑很简单,获取该 bean 的非简单属性,什么叫做非简单属性呢?就是类型为对象类型的属性,但是这里并不是将所有的对象类型都都会找到,比如 8 个原始类型,String 类型 ,Number类型、Date类型、URL类型、URI类型等都会被忽略,如下:
  1. protected String[] unsatisfiedNonSimpleProperties(AbstractBeanDefinition mbd, BeanWrapper bw) {
  2.     Set<String> result = new TreeSet<>();
  3.     PropertyValues pvs = mbd.getPropertyValues();
  4.     PropertyDescriptor[] pds = bw.getPropertyDescriptors();
  5.     for (PropertyDescriptor pd : pds) {
  6.         if (pd.getWriteMethod() != null && !isExcludedFromDependencyCheck(pd) && !pvs.contains(pd.getName()) &&
  7.                 !BeanUtils.isSimpleProperty(pd.getPropertyType())) {
  8.             result.add(pd.getName());
  9.         }
  10.     }
  11.     return StringUtils.toStringArray(result);
  12. }
复制代码
这里获取的就是需要依赖注入的属性。
autowireByName()函数的功能就是根据传入的参数中的pvs中找出已经加载的bean,并递归实例化,然后加入到pvs中
autowireByType

autowireByType与autowireByName对于我们理解与使用来说复杂程度相似,但是实现功能的复杂度却不一样,我们看下方法代码:
  1. protected void autowireByType(  
  2.         String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {  
  3.     TypeConverter converter = getCustomTypeConverter();  
  4.     if (converter == null) {  
  5.         converter = bw;  
  6.     }  
  7.     Set<String> autowiredBeanNames = new LinkedHashSet<String>(4);  
  8.     //寻找bw中需要依赖注入的属性  
  9.     String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);  
  10.     for (String propertyName : propertyNames) {  
  11.         try {  
  12.             PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName);  
  13.             // Don't try autowiring by type for type Object: never makes sense,  
  14.             // even if it technically is a unsatisfied, non-simple property.  
  15.             if (!Object.class.equals(pd.getPropertyType())) {  
  16.                 //探测指定属性的set方法  
  17.                 MethodParameter methodParam = BeanUtils.getWriteMethodParameter(pd);  
  18.                 // Do not allow eager init for type matching in case of a prioritized post-processor.  
  19.                 boolean eager = !PriorityOrdered.class.isAssignableFrom(bw.getWrappedClass());  
  20.                 DependencyDescriptor desc = new AutowireByTypeDependencyDescriptor(methodParam, eager);  
  21.                 //解析指定beanName的属性所匹配的值,并把解析到的属性名称存储在autowiredBeanNames中,  
  22.                 Object autowiredArgument = resolveDependency(desc, beanName, autowiredBeanNames, converter);  
  23.                 if (autowiredArgument != null) {  
  24.                     pvs.add(propertyName, autowiredArgument);  
  25.                 }  
  26.                 for (String autowiredBeanName : autowiredBeanNames) {  
  27.                     //注册依赖  
  28.                     registerDependentBean(autowiredBeanName, beanName);  
  29.                     if (logger.isDebugEnabled()) {  
  30.                         logger.debug("Autowiring by type from bean name '" + beanName + "' via property '" +  
  31.                                 propertyName + "' to bean named '" + autowiredBeanName + "'");  
  32.                     }  
  33.                 }  
  34.                 autowiredBeanNames.clear();  
  35.             }  
  36.         }  
  37.         catch (BeansException ex) {  
  38.             throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, propertyName, ex);  
  39.         }  
  40.     }  
  41. }
复制代码
根据名称第一步与根据属性第一步都是寻找bw中需要依赖注入的属性,然后遍历这些属性并寻找类型匹配的bean,其中最复杂就是寻找类型匹配的bean。spring中提供了对集合的类型注入支持,如使用如下注解方式:
  1. @Autowired
  2. private List<Test> tests;
复制代码
这种方式spring会把所有与Test匹配的类型找出来并注入到tests属性中,正是由于这一因素,所以在autowireByType函数,新建了局部遍历autowireBeanNames,用于存储所有依赖的bean,如果只是对非集合类的属性注入来说,此属性并无用处。
对于寻找类型匹配的逻辑实现是封装在了resolveDependency函数中,其实现如下:
  1. public Object resolveDependency(DependencyDescriptor descriptor, String beanName, Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException {
  2.     descriptor.initParameterNameDiscovery(getParameterNameDiscoverer());  
  3.     if (descriptor.getDependencyType().equals(ObjectFactory.class)) {  
  4.         //ObjectFactory类注入的特殊处理  
  5.         return new DependencyObjectFactory(descriptor, beanName);  
  6.     }  
  7.     else if (descriptor.getDependencyType().equals(javaxInjectProviderClass)) {  
  8.         //javaxInjectProviderClass类注入的特殊处理  
  9.         return new DependencyProviderFactory().createDependencyProvider(descriptor, beanName);  
  10.     }  
  11.     else {  
  12.         //通用处理逻辑  
  13.         return doResolveDependency(descriptor, descriptor.getDependencyType(), beanName, autowiredBeanNames, typeConverter);  
  14.     }  
  15. }  
  16. protected Object doResolveDependency(DependencyDescriptor descriptor, Class<?> type, String beanName,  
  17.         Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException {  
  18.     /*
  19.      * 用于支持Spring中新增的注解@Value
  20.      */  
  21.     Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);  
  22.     if (value != null) {  
  23.         if (value instanceof String) {  
  24.             String strVal = resolveEmbeddedValue((String) value);  
  25.             BeanDefinition bd = (beanName != null && containsBean(beanName) ? getMergedBeanDefinition(beanName) : null);  
  26.             value = evaluateBeanDefinitionString(strVal, bd);  
  27.         }  
  28.         TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());  
  29.         return (descriptor.getField() != null ?  
  30.                 converter.convertIfNecessary(value, type, descriptor.getField()) :  
  31.                 converter.convertIfNecessary(value, type, descriptor.getMethodParameter()));  
  32.     }  
  33.     //如果解析器没有成功解析,则需要考虑各种情况  
  34.     //属性是数组类型  
  35.     if (type.isArray()) {  
  36.         Class<?> componentType = type.getComponentType();  
  37.         //根据属性类型找到beanFactory中所有类型的匹配bean,  
  38.         //返回值的构成为:key=匹配的beanName,value=beanName对应的实例化后的bean(通过getBean(beanName)返回)  
  39.         Map<String, Object> matchingBeans = findAutowireCandidates(beanName, componentType, descriptor);  
  40.         if (matchingBeans.isEmpty()) {  
  41.             //如果autowire的require属性为true而找到的匹配项却为空则只能抛出异常  
  42.             if (descriptor.isRequired()) {  
  43.                 raiseNoSuchBeanDefinitionException(componentType, "array of " + componentType.getName(), descriptor);  
  44.             }  
  45.             return null;  
  46.         }  
  47.         if (autowiredBeanNames != null) {  
  48.             autowiredBeanNames.addAll(matchingBeans.keySet());  
  49.         }  
  50.         TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());  
  51.         //通过转换器将bean的值转换为对应的type类型  
  52.         return converter.convertIfNecessary(matchingBeans.values(), type);  
  53.     }  
  54.     //属性是Collection类型  
  55.     else if (Collection.class.isAssignableFrom(type) && type.isInterface()) {  
  56.         Class<?> elementType = descriptor.getCollectionType();  
  57.         if (elementType == null) {  
  58.             if (descriptor.isRequired()) {  
  59.                 throw new FatalBeanException("No element type declared for collection [" + type.getName() + "]");  
  60.             }  
  61.             return null;  
  62.         }  
  63.         Map<String, Object> matchingBeans = findAutowireCandidates(beanName, elementType, descriptor);  
  64.         if (matchingBeans.isEmpty()) {  
  65.             if (descriptor.isRequired()) {  
  66.                 raiseNoSuchBeanDefinitionException(elementType, "collection of " + elementType.getName(), descriptor);  
  67.             }  
  68.             return null;  
  69.         }  
  70.         if (autowiredBeanNames != null) {  
  71.             autowiredBeanNames.addAll(matchingBeans.keySet());  
  72.         }  
  73.         TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());  
  74.         return converter.convertIfNecessary(matchingBeans.values(), type);  
  75.     }  
  76.     //属性是Map类型  
  77.     else if (Map.class.isAssignableFrom(type) && type.isInterface()) {  
  78.         Class<?> keyType = descriptor.getMapKeyType();  
  79.         if (keyType == null || !String.class.isAssignableFrom(keyType)) {  
  80.             if (descriptor.isRequired()) {  
  81.                 throw new FatalBeanException("Key type [" + keyType + "] of map [" + type.getName() +  
  82.                         "] must be assignable to [java.lang.String]");  
  83.             }  
  84.             return null;  
  85.         }  
  86.         Class<?> valueType = descriptor.getMapValueType();  
  87.         if (valueType == null) {  
  88.             if (descriptor.isRequired()) {  
  89.                 throw new FatalBeanException("No value type declared for map [" + type.getName() + "]");  
  90.             }  
  91.             return null;  
  92.         }  
  93.         Map<String, Object> matchingBeans = findAutowireCandidates(beanName, valueType, descriptor);  
  94.         if (matchingBeans.isEmpty()) {  
  95.             if (descriptor.isRequired()) {  
  96.                 raiseNoSuchBeanDefinitionException(valueType, "map with value type " + valueType.getName(), descriptor);  
  97.             }  
  98.             return null;  
  99.         }  
  100.         if (autowiredBeanNames != null) {  
  101.             autowiredBeanNames.addAll(matchingBeans.keySet());  
  102.         }  
  103.         return matchingBeans;  
  104.     }  
  105.     else {  
  106.         Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor);  
  107.         if (matchingBeans.isEmpty()) {  
  108.             if (descriptor.isRequired()) {  
  109.                 raiseNoSuchBeanDefinitionException(type, "", descriptor);  
  110.             }  
  111.             return null;  
  112.         }  
  113.         if (matchingBeans.size() > 1) {  
  114.             String primaryBeanName = determinePrimaryCandidate(matchingBeans, descriptor);  
  115.             if (primaryBeanName == null) {  
  116.                 throw new NoUniqueBeanDefinitionException(type, matchingBeans.keySet());  
  117.             }  
  118.             if (autowiredBeanNames != null) {  
  119.                 autowiredBeanNames.add(primaryBeanName);  
  120.             }  
  121.             return matchingBeans.get(primaryBeanName);  
  122.         }  
  123.         // We have exactly one match.  
  124.         Map.Entry<String, Object> entry = matchingBeans.entrySet().iterator().next();  
  125.         if (autowiredBeanNames != null) {  
  126.             autowiredBeanNames.add(entry.getKey());  
  127.         }  
  128.         //已经确定只有一个匹配项  
  129.         return entry.getValue();  
  130.     }  
  131. }
复制代码
主要就是通过Type从BeanFactory中找到对应的benaName,然后通过getBean获取实例
  1. protected Map<String, Object> findAutowireCandidates(
  2.         @Nullable String beanName, Class<?> requiredType, DependencyDescriptor descriptor) {
  3.     //在BeanFactory找到所有Type类型的beanName
  4.     String[] candidateNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
  5.             this, requiredType, true, descriptor.isEager());
  6.     Map<String, Object> result = new LinkedHashMap<>(candidateNames.length);
  7.     //遍历所有的beanName,通过getBean获取
  8.     for (String candidate : candidateNames) {
  9.         if (!isSelfReference(beanName, candidate) && isAutowireCandidate(candidate, descriptor)) {
  10.             //
  11.             addCandidateEntry(result, candidate, descriptor, requiredType);
  12.         }
  13.     }
  14.     return result;
  15. }
  16. private void addCandidateEntry(Map<String, Object> candidates, String candidateName,
  17.         DependencyDescriptor descriptor, Class<?> requiredType) {
  18.     Object beanInstance = descriptor.resolveCandidate(candidateName, requiredType, this);
  19.     if (!(beanInstance instanceof NullBean)) {
  20.         candidates.put(candidateName, beanInstance);
  21.     }
  22. }
  23. public Object resolveCandidate(String beanName, Class<?> requiredType, BeanFactory beanFactory)
  24.         throws BeansException {
  25.     //通过类型找到beanName,然后再找到其实例
  26.     return beanFactory.getBean(beanName);
  27. }
复制代码
applyPropertyValues

程序运行到这里,已经完成了对所有注入属性的获取,但是获取的属性是以PropertyValues形式存在的,还并没有应用到已经实例化的bean中,这一工作是在applyPropertyValues中。继续跟踪到方法体中:
  1. protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {  
  2.     if (pvs == null || pvs.isEmpty()) {  
  3.         return;  
  4.     }  
  5.     MutablePropertyValues mpvs = null;  
  6.     List<PropertyValue> original;  
  7.     if (System.getSecurityManager() != null) {  
  8.         if (bw instanceof BeanWrapperImpl) {  
  9.             ((BeanWrapperImpl) bw).setSecurityContext(getAccessControlContext());  
  10.         }  
  11.     }  
  12.     if (pvs instanceof MutablePropertyValues) {  
  13.         mpvs = (MutablePropertyValues) pvs;  
  14.         //如果mpvs中的值已经被转换为对应的类型那么可以直接设置到beanwapper中  
  15.         if (mpvs.isConverted()) {  
  16.             // Shortcut: use the pre-converted values as-is.  
  17.             try {  
  18.                 bw.setPropertyValues(mpvs);  
  19.                 return;  
  20.             }  
  21.             catch (BeansException ex) {  
  22.                 throw new BeanCreationException(  
  23.                         mbd.getResourceDescription(), beanName, "Error setting property values", ex);  
  24.             }  
  25.         }  
  26.         original = mpvs.getPropertyValueList();  
  27.     }  
  28.     else {  
  29.         //如果pvs并不是使用MutablePropertyValues封装的类型,那么直接使用原始的属性获取方法  
  30.         original = Arrays.asList(pvs.getPropertyValues());  
  31.     }  
  32.     TypeConverter converter = getCustomTypeConverter();  
  33.     if (converter == null) {  
  34.         converter = bw;  
  35.     }  
  36.     //获取对应的解析器  
  37.     BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);  
  38.     // Create a deep copy, resolving any references for values.  
  39.     List<PropertyValue> deepCopy = new ArrayList<PropertyValue>(original.size());  
  40.     boolean resolveNecessary = false;  
  41.     //遍历属性,将属性转换为对应类的对应属性的类型  
  42.     for (PropertyValue pv : original) {  
  43.         if (pv.isConverted()) {  
  44.             deepCopy.add(pv);  
  45.         }  
  46.         else {  
  47.             String propertyName = pv.getName();  
  48.             Object originalValue = pv.getValue();  
  49.             Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);  
  50.             Object convertedValue = resolvedValue;  
  51.             boolean convertible = bw.isWritableProperty(propertyName) &&  
  52.                     !PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);  
  53.             if (convertible) {  
  54.                 convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter);  
  55.             }  
  56.             // Possibly store converted value in merged bean definition,  
  57.             // in order to avoid re-conversion for every created bean instance.  
  58.             if (resolvedValue == originalValue) {  
  59.                 if (convertible) {  
  60.                     pv.setConvertedValue(convertedValue);  
  61.                 }  
  62.                 deepCopy.add(pv);  
  63.             }  
  64.             else if (convertible && originalValue instanceof TypedStringValue &&  
  65.                     !((TypedStringValue) originalValue).isDynamic() &&  
  66.                     !(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))) {  
  67.                 pv.setConvertedValue(convertedValue);  
  68.                 deepCopy.add(pv);  
  69.             }  
  70.             else {  
  71.                 resolveNecessary = true;  
  72.                 deepCopy.add(new PropertyValue(pv, convertedValue));  
  73.             }  
  74.         }  
  75.     }  
  76.     if (mpvs != null && !resolveNecessary) {  
  77.         mpvs.setConverted();  
  78.     }  
  79.     // Set our (possibly massaged) deep copy.  
  80.     try {  
  81.         bw.setPropertyValues(new MutablePropertyValues(deepCopy));  
  82.     }  
  83.     catch (BeansException ex) {  
  84.         throw new BeanCreationException(  
  85.                 mbd.getResourceDescription(), beanName, "Error setting property values", ex);  
  86.     }  
  87. }
复制代码
我们来看看具体的属性赋值过程
  1. public class MyTestBean {
  2.     private String name ;
  3.     public MyTestBean(String name) {
  4.         this.name = name;
  5.     }
  6.     public MyTestBean() {
  7.     }
  8.     public String getName() {
  9.         return name;
  10.     }
  11.     public void setName(String name) {
  12.         this.name = name;
  13.     }
  14. }
  15. <bean id="myTestBean"  >
  16.         <property name="name" value="dabin"></property>
  17. </bean>
复制代码
如上 bw.setPropertyValues 最终都会走到如下方法
  1. @Override
  2. public void setValue(final @Nullable Object value) throws Exception {
  3.     //获取writeMethod,也就是我们MyTestBean的setName方法
  4.     final Method writeMethod = (this.pd instanceof GenericTypeAwarePropertyDescriptor ?
  5.             ((GenericTypeAwarePropertyDescriptor) this.pd).getWriteMethodForActualAccess() :
  6.             this.pd.getWriteMethod());
  7.     if (System.getSecurityManager() != null) {
  8.         AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
  9.             ReflectionUtils.makeAccessible(writeMethod);
  10.             return null;
  11.         });
  12.         try {
  13.             AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () ->
  14.                     writeMethod.invoke(getWrappedInstance(), value), acc);
  15.         }
  16.         catch (PrivilegedActionException ex) {
  17.             throw ex.getException();
  18.         }
  19.     }
  20.     else {
  21.         ReflectionUtils.makeAccessible(writeMethod);
  22.         //通过反射调用方法进行赋值
  23.         writeMethod.invoke(getWrappedInstance(), value);
  24.     }
  25. }
复制代码
就是利用反射进行调用对象的set方法赋值
至此,doCreateBean() 第二个过程:属性填充 已经分析完成了,下篇分析第三个过程:循环依赖的处理,其实循环依赖并不仅仅只是在 doCreateBean() 中处理,其实在整个加载 bean 的过程中都有涉及,所以下篇内容并不仅仅只局限于 doCreateBean()。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表