think in spring refresh 11 - 3

doCreateBean 方法中:

 //  上面是创建了 bean 实例   
// Initialize the bean instance. Object exposedObject = bean; try {
// 对 bean 实例的属性进行赋值 populateBean(beanName, mbd, instanceWrapper); // 1
// 初始化 bean exposedObject
= initializeBean(beanName, exposedObject, mbd); }

AbstractAutowireCapableBeanFactory中的方法: 

  protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
        if (bw == null) {   // 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.

// if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationAwareBeanPostProcessor) { InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
// 在 bean 实例化后, 属性赋值之前, 调用后置处理器中的方法 能够修改bean的属性!! ※ ※
if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) { return; } } } } // pvs 是什么 ??? PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null); // 解析自动装配模式为 AUTOWIRE_BY_NAME 和 AUTOWIRE_BY_TYPE ( 现在几乎不用??? 什么意思) 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); // 1.2 }
// Add property values based on autowire by type if applicable. if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
// 解析根据类型的注入 autowireByType(beanName, mbd, bw, newPvs); // 1.3 } pvs
= newPvs; } // beanFactory 是否注册过 InstantiationAwareBeanPostProcessors 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;
// 又是调用这种后置处理器
// 进行属性填充前的再次处理 @Autowire属性注入 就是在这里注入的依赖的 bean 实例对象 ???? PropertyValues pvsToUse
= ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName); if (pvsToUse == null) { if (filteredPds == null) { filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching); } pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName); if (pvsToUse == null) { return; } } pvs = pvsToUse; } } } if (needsDepCheck) { if (filteredPds == null) { filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching); } checkDependencies(beanName, mbd, filteredPds, pvs); } if (pvs != null) {
// 将所有 PropertyValues 中的属性填充到bean中 applyPropertyValues(beanName, mbd, bw, pvs); } }

1.2   autowireByName

protected void autowireByName(
            String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {

        String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);   // 1.2.1
        for (String propertyName : propertyNames) {
            if (containsBean(propertyName)) {
                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");
                }
            }
        }
    }

1.2.1 

  protected String[] unsatisfiedNonSimpleProperties(AbstractBeanDefinition mbd, BeanWrapper bw) {
        Set<String> result = new TreeSet<>();
// PropertyValues pvs
= mbd.getPropertyValues();
// ProPertyDescriptor 是在什么时候进行设置的???? ProPertyDescriptor是反射中的类,jdk自带的 PropertyDescriptor[] pds
= bw.getPropertyDescriptors(); for (PropertyDescriptor pd : pds) {
//
if (pd.getWriteMethod() != null && !isExcludedFromDependencyCheck(pd) && !pvs.contains(pd.getName()) && !BeanUtils.isSimpleProperty(pd.getPropertyType())) { result.add(pd.getName()); } } return StringUtils.toStringArray(result); }

 

posted @ 2020-12-02 21:04  你眼里的星辰  阅读(76)  评论(0)    收藏  举报