美文网首页Spring相关时序图系列
Spring IOC(6)AbstractAutowireCap

Spring IOC(6)AbstractAutowireCap

作者: 涣涣虚心0215 | 来源:发表于2020-12-13 16:09 被阅读0次
    DefaultListableBeanFactory继承关系

    继续从这张继承关系往下走,AbstractBeanFactory的子类AbstractAutowireCapableBeanFactory,它额外还实现了AutowireCapableBeanFactory。
    上一章我们回顾了所遇到的BeanFactory的接口,AutowireCapableBeanFactory主要是用于自动装配,Bean的创建、属性填充、连接(包括自动装配)、初始化和销毁,以及BeanPostProcessor的调用。

    AbstractAutowireCapableBeanFactory

    AbstractAutowireCapableBeanFactory会对接口方法进行实现,比如createBean(), initializeBean(), applyBeanPostProcessorsBeforeInitialization(), applyBeanPostProcessorsAfterInitialization()。
    此外上面提到对于属性的填充的方法在getBean的过程中也是高频率调用的,比如applyPropertyValues(beanName, BeanDefinition, BeanWrapper, PropertyValues),以及resolveDependency(DependencyDescriptor, requestingBeanName)

    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
            implements AutowireCapableBeanFactory {
        //策略模式,默认是Cglib,也可以是JDK动态代理
        private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();
        //是否允许bean的循环引用,默认是true
        private boolean allowCircularReferences = true;
        //忽略给定type的自动装配功能autowiring
        private final Set<Class<?>> ignoredDependencyTypes = new HashSet<>();
        //忽略给定interface的自动装配功能autowiring
        private final Set<Class<?>> ignoredDependencyInterfaces = new HashSet<>();
        public AbstractAutowireCapableBeanFactory() {
            super();
            //自动装配时忽略给定的依赖接口,典型应用是通过其他方式解析Application上下文注册依赖,
            // 类似BeanFactory通过BeanFactoryAware进行诸如或者ApplicationContext通过ApplicationContextAware进行注入
            ignoreDependencyInterface(BeanNameAware.class);
            ignoreDependencyInterface(BeanFactoryAware.class);
            ignoreDependencyInterface(BeanClassLoaderAware.class);
        }
        //设置初始化策略
        public void setInstantiationStrategy(InstantiationStrategy instantiationStrategy) {
            this.instantiationStrategy = instantiationStrategy;
        }
        //获得初始化策略
        protected InstantiationStrategy getInstantiationStrategy() {
            return this.instantiationStrategy;
        }
        //创建bean并且初始化
        public <T> T createBean(Class<T> beanClass) throws BeansException {
            // Use prototype bean definition, to avoid registering bean as dependent bean.
            RootBeanDefinition bd = new RootBeanDefinition(beanClass);
            bd.setScope(SCOPE_PROTOTYPE);
            bd.allowCaching = ClassUtils.isCacheSafe(beanClass, getBeanClassLoader());
            return (T) createBean(beanClass.getName(), bd, null);
        }
        //给bean populate属性
        public void autowireBean(Object existingBean) {
            // Use non-singleton bean definition, to avoid registering bean as dependent bean.
            RootBeanDefinition bd = new RootBeanDefinition(ClassUtils.getUserClass(existingBean));
            bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);
            bd.allowCaching = ClassUtils.isCacheSafe(bd.getBeanClass(), getBeanClassLoader());
            BeanWrapper bw = new BeanWrapperImpl(existingBean);
            initBeanWrapper(bw);
            populateBean(bd.getBeanClass().getName(), bd, bw);
        }
    
        //给bean populate属性以及调用初始化方法
        public Object configureBean(Object existingBean, String beanName) throws BeansException {
            markBeanAsCreated(beanName);
            BeanDefinition mbd = getMergedBeanDefinition(beanName);
            RootBeanDefinition bd = null;
            if (mbd instanceof RootBeanDefinition) {
                RootBeanDefinition rbd = (RootBeanDefinition) mbd;
                bd = (rbd.isPrototype() ? rbd : rbd.cloneBeanDefinition());
            }
            if (bd == null) {
                bd = new RootBeanDefinition(mbd);
            }
            if (!bd.isPrototype()) {
                bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);
                bd.allowCaching = ClassUtils.isCacheSafe(ClassUtils.getUserClass(existingBean), getBeanClassLoader());
            }
            BeanWrapper bw = new BeanWrapperImpl(existingBean);
            initBeanWrapper(bw);
            populateBean(beanName, bd, bw);
            return initializeBean(beanName, existingBean, bd);
        }
        //依赖查找的核心方法,由DefaultListableBeanFactory实现
        public Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException {
            return resolveDependency(descriptor, requestingBeanName, null, null);
        }
        //创建bean并且实例化
        public Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException {
            // Use non-singleton bean definition, to avoid registering bean as dependent bean.
            RootBeanDefinition bd = new RootBeanDefinition(beanClass, autowireMode, dependencyCheck);
            bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);
            return createBean(beanClass.getName(), bd, null);
        }
        //通过InstantiationStrategy实例化bean,并且populatebean的属性值
        public Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException {
            // Use non-singleton bean definition, to avoid registering bean as dependent bean.
            final RootBeanDefinition bd = new RootBeanDefinition(beanClass, autowireMode, dependencyCheck);
            bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);
            if (bd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR) {
                return autowireConstructor(beanClass.getName(), bd, null, null).getWrappedInstance();
            }
            else {
                Object bean;
                final BeanFactory parent = this;
                if (System.getSecurityManager() != null) {
                    bean = AccessController.doPrivileged((PrivilegedAction<Object>) () ->
                            getInstantiationStrategy().instantiate(bd, null, parent),
                            getAccessControlContext());
                }
                else {
                    bean = getInstantiationStrategy().instantiate(bd, null, parent);
                }
                populateBean(beanClass.getName(), bd, new BeanWrapperImpl(bean));
                return bean;
            }
        }
        //对于给定的bean,populate它的属性
        public void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
                throws BeansException {
    
            if (autowireMode == AUTOWIRE_CONSTRUCTOR) {
                throw new IllegalArgumentException("AUTOWIRE_CONSTRUCTOR not supported for existing bean instance");
            }
            // Use non-singleton bean definition, to avoid registering bean as dependent bean.
            RootBeanDefinition bd =
                    new RootBeanDefinition(ClassUtils.getUserClass(existingBean), autowireMode, dependencyCheck);
            bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);
            BeanWrapper bw = new BeanWrapperImpl(existingBean);
            initBeanWrapper(bw);
            populateBean(bd.getBeanClass().getName(), bd, bw);
        }
        //将beanName对应的BeanDefinition的属性值,复制给existingBean
        public void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException {
            markBeanAsCreated(beanName);
            BeanDefinition bd = getMergedBeanDefinition(beanName);
            BeanWrapper bw = new BeanWrapperImpl(existingBean);
            initBeanWrapper(bw);
            applyPropertyValues(beanName, bd, bw, bd.getPropertyValues());
        }
        //初始化Bean
        public Object initializeBean(Object existingBean, String beanName) {
            return initializeBean(beanName, existingBean, null);
        }
        //遍历BeanPostProcessors,调用PostProcessorsBeforeInitialization
        public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
                throws BeansException {
    
            Object result = existingBean;
            for (BeanPostProcessor processor : getBeanPostProcessors()) {
                Object current = processor.postProcessBeforeInitialization(result, beanName);
                if (current == null) {
                    return result;
                }
                result = current;
            }
            return result;
        }
        //遍历BeanPostProcessors,调用PBeanPostProcessorsAfterInitialization
        public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
                throws BeansException {
    
            Object result = existingBean;
            for (BeanPostProcessor processor : getBeanPostProcessors()) {
                Object current = processor.postProcessAfterInitialization(result, beanName);
                if (current == null) {
                    return result;
                }
                result = current;
            }
            return result;
        }
        //销毁bean
        public void destroyBean(Object existingBean) {
            new DisposableBeanAdapter(existingBean, getBeanPostProcessors(), getAccessControlContext()).destroy();
        }
        //上面createBean的调用的方法
        protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
                throws BeanCreationException {
            RootBeanDefinition mbdToUse = mbd;
            //获得beanName对应点class
            Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
            if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
                mbdToUse = new RootBeanDefinition(mbd);
                mbdToUse.setBeanClass(resolvedClass);
            }
            try {
                mbdToUse.prepareMethodOverrides();
            }
            catch (BeanDefinitionValidationException ex) {
                throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
                        beanName, "Validation of method overrides failed", ex);
            }
            try {
                // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
                //在实例化之前给BeanPostProcessor机会进行处理
                Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
                if (bean != null) {
                    return bean;
                }
            }
            catch (Throwable ex) {
                throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
                        "BeanPostProcessor before instantiation of bean failed", ex);
            }
            try {
                //调用doCreateBean去真正的创建bean
                Object beanInstance = doCreateBean(beanName, mbdToUse, args);
                if (logger.isTraceEnabled()) {
                    logger.trace("Finished creating instance of bean '" + beanName + "'");
                }
                return beanInstance;
            }
            catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
                // A previously detected exception with proper bean creation context already,
                // or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.
                throw ex;
            }
            catch (Throwable ex) {
                throw new BeanCreationException(
                        mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
            }
        }
        //真正createbean的方法
        protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
                throws BeanCreationException {
            BeanWrapper instanceWrapper = null;
            if (mbd.isSingleton()) {
                instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
            }
            if (instanceWrapper == null) {
                //创建bean的实例
                instanceWrapper = createBeanInstance(beanName, mbd, args);
            }
            final Object bean = instanceWrapper.getWrappedInstance();
            Class<?> beanType = instanceWrapper.getWrappedClass();
            if (beanType != NullBean.class) {
                mbd.resolvedTargetType = beanType;
            }
            synchronized (mbd.postProcessingLock) {
                if (!mbd.postProcessed) {
                    try {
                        applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
                    }
                    catch (Throwable ex) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                                "Post-processing of merged bean definition failed", ex);
                    }
                    mbd.postProcessed = true;
                }
            }
    
            // 处理循环依赖的一个点,创建bean实例之后首先放入SingletonFactory缓存中
            boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
                    isSingletonCurrentlyInCreation(beanName));
            if (earlySingletonExposure) {
                if (logger.isTraceEnabled()) {
                    logger.trace("Eagerly caching bean '" + beanName +
                            "' to allow for resolving potential circular references");
                }
                addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
            }
    
            // Initialize the bean instance.
            Object exposedObject = bean;
            try {
                //设置bean的属性
                populateBean(beanName, mbd, instanceWrapper);
                //初始化相应的bean
                exposedObject = initializeBean(beanName, exposedObject, mbd);
            }
            catch (Throwable ex) {
                if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
                    throw (BeanCreationException) ex;
                }
                else {
                    throw new BeanCreationException(
                            mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
                }
            }
    
            if (earlySingletonExposure) {
                Object earlySingletonReference = getSingleton(beanName, false);
                if (earlySingletonReference != null) {
                    if (exposedObject == bean) {
                        exposedObject = earlySingletonReference;
                    }
                    else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
                        String[] dependentBeans = getDependentBeans(beanName);
                        Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
                        for (String dependentBean : dependentBeans) {
                            if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
                                actualDependentBeans.add(dependentBean);
                            }
                        }
                        if (!actualDependentBeans.isEmpty()) {
                            throw new BeanCurrentlyInCreationException(beanName,
                                    "Bean with name '" + beanName + "' has been injected into other beans [" +
                                    StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
                                    "] in its raw version as part of a circular reference, but has eventually been " +
                                    "wrapped. This means that said other beans do not use the final version of the " +
                                    "bean. This is often the result of over-eager type matching - consider using " +
                                    "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
                        }
                    }
                }
            }
    
            // Register bean as disposable.
            try {
                registerDisposableBeanIfNecessary(beanName, bean, mbd);
            }
            catch (BeanDefinitionValidationException ex) {
                throw new BeanCreationException(
                        mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
            }
    
            return exposedObject;
        }
        //创建bean的实例
        protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
            // Make sure bean class is actually resolved at this point.
            Class<?> beanClass = resolveBeanClass(mbd, beanName);
    
            if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
                throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                        "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
            }
    
            Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
            if (instanceSupplier != null) {
                return obtainFromSupplier(instanceSupplier, beanName);
            }
    
            if (mbd.getFactoryMethodName() != null) {
                return instantiateUsingFactoryMethod(beanName, mbd, args);
            }
    
            // Shortcut when re-creating the same bean...
            boolean resolved = false;
            boolean autowireNecessary = false;
            if (args == null) {
                synchronized (mbd.constructorArgumentLock) {
                    if (mbd.resolvedConstructorOrFactoryMethod != null) {
                        resolved = true;
                        autowireNecessary = mbd.constructorArgumentsResolved;
                    }
                }
            }
            if (resolved) {
                if (autowireNecessary) {
                    return autowireConstructor(beanName, mbd, null, null);
                }
                else {
                    return instantiateBean(beanName, mbd);
                }
            }
    
            // Candidate constructors for autowiring?
            Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
            if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
                    mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
                return autowireConstructor(beanName, mbd, ctors, args);
            }
    
            // Preferred constructors for default construction?
            ctors = mbd.getPreferredConstructors();
            if (ctors != null) {
                return autowireConstructor(beanName, mbd, ctors, null);
            }
    
            // No special handling: simply use no-arg constructor.
            return instantiateBean(beanName, mbd);
        }
        //实例化Bean
        protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
            try {
                Object beanInstance;
                final BeanFactory parent = this;
                if (System.getSecurityManager() != null) {
                    beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () ->
                            getInstantiationStrategy().instantiate(mbd, beanName, parent),
                            getAccessControlContext());
                }
                else {
                    beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
                }
                BeanWrapper bw = new BeanWrapperImpl(beanInstance);
                initBeanWrapper(bw);
                return bw;
            }
            catch (Throwable ex) {
                throw new BeanCreationException(
                        mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);
            }
        }
        //给对应的bean设置属性值
        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;
                }
            }
            boolean continueWithPropertyPopulation = true;
            if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
                for (BeanPostProcessor bp : getBeanPostProcessors()) {
                    if (bp instanceof InstantiationAwareBeanPostProcessor) {
                        InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                        if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                            continueWithPropertyPopulation = false;
                            break;
                        }
                    }
                }
            }
    
            if (!continueWithPropertyPopulation) {
                return;
            }
    
            PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
            //这里根据xml里面autowire值来判断如何注入的
            if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
                MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
                // Add property values based on autowire by name if applicable.
                if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME) {
                    autowireByName(beanName, mbd, bw, newPvs);
                }
                // Add property values based on autowire by type if applicable.
                if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
                    autowireByType(beanName, mbd, bw, newPvs);
                }
                pvs = newPvs;
            }
    
            boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
            boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
    
            PropertyDescriptor[] filteredPds = null;
            if (hasInstAwareBpps) {
                if (pvs == null) {
                    pvs = mbd.getPropertyValues();
                }
                //这里主要对应@autowired注解的处理
                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);
                            }
                            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) {
                拿到队形的pvs就开始设置到对应的属性
                applyPropertyValues(beanName, mbd, bw, pvs);
            }
        }
        //给bean设置对应的property value
        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;
                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 {
                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();
                    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);
            }
        }
        //初始化bean实例
        protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
            if (System.getSecurityManager() != null) {
                AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                    invokeAwareMethods(beanName, bean);
                    return null;
                }, getAccessControlContext());
            }
            else {
                //调用相应的aware方法,比如BeanFactoryAware,来设置BeanFactory属性
                invokeAwareMethods(beanName, bean);
            }
            Object wrappedBean = bean;
            if (mbd == null || !mbd.isSynthetic()) {
                //调用初始化方法之前调用BeanPostProcessorsBeforeInitialization
                wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
            }
            try {
                //调用初始化方法,包括afterProperty()以及customer初始化方法
                invokeInitMethods(beanName, wrappedBean, mbd);
            }
            catch (Throwable ex) {
                throw new BeanCreationException(
                        (mbd != null ? mbd.getResourceDescription() : null),
                        beanName, "Invocation of init method failed", ex);
            }
            if (mbd == null || !mbd.isSynthetic()) {
                //调用初始化方法之后调用BeanPostProcessorsAfterInitialization
                wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
            }
            return wrappedBean;
        }
    }
    

    相关文章

      网友评论

        本文标题:Spring IOC(6)AbstractAutowireCap

        本文链接:https://www.haomeiwen.com/subject/ufhpgktx.html