Spring源码之IoC容器的Bean创建和依赖注入,DefaultListableBeanFactory容器为例

接上篇Spring源码之IoC容器初始化过程,以FileSystemXmlApplicationContext容器为例
因为FileSystemXmlApplicationContext使用的容器为DefaultListableBeanFactory,所以该篇基于DefaultListableBeanFactory的实现分析依赖注入过程。

获取Bean的总体流程

getBean流程:
依赖注入通过BeanFactory的getBean方法触发。
DefaultListableBeanFactory的getBean方法通过继承AbstractAutowireCapableBeanFactory,AbstractAutowireCapableBeanFactory继承AbstractBeanFactory获得,具体的实现在AbstractBeanFactory中。

1、通过getBean方法触发依赖注入

2、getBean方法调用doGetBean方法,这是实际触发依赖注入的方法

3、先从缓存中取得Bean,处理那些已经被创建过的单件模式的Bean,对这种Bean的请求不需要重复的创建

4、如果从缓存中获得Bean,通过getObjectForBeanInstance方法完成FactoryBean的相关处理,取得FactoryBean的处理结果。

5、如果从缓存中未获得Bean,并且双亲BeanFactory不为null。检查当前IoC容器中是否存在对应的BeanDefinition,也就是检查是否能在当前的BeanFactory的Map中取得需要的Bean。

6、如果在当前的BeanFactory工厂中取不到BeanDefinition,则到双亲BeanFactory中取,也就是调用双亲BeanFactory的getBean方法。如果在当前的双亲工厂中还取不到,则递归顺着双亲BeanFactory链一直向上查找。

7、如果双亲BeanFactory为null,或者当前IoC容器中存在对应的BeanDefinition,根据Bean的名称获取BeanDefinition。

8、获取当前Bean的所有依赖的Bean名称,把依赖的Bean注册到dependentBeanMap中。并调用getBean方法注册每个依赖Bean的依赖Bean。调用getBean方法传入依赖Bean名称,这样会触发getBean的递归调用,直到取到一个没有任何依赖的Bean为止。

9、判断Bean是Singleton还是Prototype,通过调用createBean方法创建Bean实例,通过getObjectForBeanInstance方法完成FactoryBean的相关处理。

10、最后对Bean进行类型检查,如果没问题,则返回这个新创建的Bean,这个Bean是包含了依赖关系的Bean。

Bean对象的实例化

createBean方法流程:
该方法在AbstractAutowireCapableBeanFactory中实现

1、判断需要创建的Bean是否可以实例化,这个类是否可以通过类装载器来载入

2、如果Bean配置了PostProcessor,则获取一个proxy代理对象。

3、createBean调用doCreateBean创建Bean。doCreateBean中,用一个BeanWrapper持有创建出来的Bean对象。

4、如果是Singleton,先把缓存中的同名Bean清除。如果缓存找那个存在对应的Bean,则返回对应的Bean并作为即将获取的Bean,如果缓存中不存在,则调用createBeanInstance创建Bean对象。

5、调用populateBean方法对Bean进行初始化,以及依赖关系的注入。

createBeanInstance方法:

1、确认需要创建的Bean实例的类可以实例化。

2、如果instanceSupplier不为空,则通过instanceSupplier直接获取实例。

3、如果有工厂方法,则通过工厂方法对Bean进行实例化。

4、以上两种情况都不满足,则使用构造函数进行实例化。

5、通过构造函数后置处理器determineConstructorsFromBeanPostProcessors, 来选择使用哪个构造函数来实例化Bean。

6、如果构造函数后置处理器返回的构造函数为空,则用默认的构造函数对Bean进行实例化。通过instantiateBean(beanName, mbd)方法进行实例化。

instantiateBean方法:

1、使用默认的实例化策略对Bean进行实例化,默认的策略是使用CGLIB来对Bean进行实例化。

2、调用instantiate实例化Bean

SimpleInstantiationStrategy中的instantiate方法:

MethodOverrides的作用是在spring配置中存在lookup-mehtod和rreplace-method的,而这两个配置在加载xml的时候就会统一存放在BeanDefinition中的methodOverrides属性里

1、判断MethodOverrides是否为空,不为空时,使用CGLIB来实例化对象。

2、MethodOverrides为空时,取得指定的构造器或者生成对象的工厂方法来对Bean进行实例化,通过BeanUtils进行实例化,BeanUtils通过Constructor来实例化Bean,使用的是JVM的反射功能。

Bean对象依赖关系的注入

populateBean方法:

1、在创建Bean后,执行Bean的后置处理BeanPostProcessor

2、获取Bean的所有属性PropertyValues

3、开始进行依赖注入,先处理autowire的注入

4、根据Bean的名字或者类型,调用autowireByName或autowireByType方法,来完成Bean的autowire注入

5、调用applyPropertyValues对属性进行注入

6、applyPropertyValues中,通过BeanDefinitionValueResolver对BeanDefinition进行解析,applyPropertyValues方法调用了resolveValueIfNecessary方法,resolveValueIfNecessary方法调用了resolveReference方法,resolveValueIfNecessary包含了所有对注入类型的处理。

7、通过bw.setPropertyValues(new MutablePropertyValues(deepCopy));进行依赖注入

resolveReference方法:

1、根据RuntimeBeanReference判断每个PropertyValue,也就是依赖对象,是否在双亲IoC容器中

2、如果是在双亲IoC容器中,Bean的类型不为空,根据类型从双亲IoC容器中获取Bean,否则根据名字从双亲IoC容器中获取Bean

3、如果不在双亲IoC容器中,从当前容器获取Bean的实例和名字,调用当前容器的getBean获取

4、完成以上步骤后,已经为依赖注入准备好了条件,接下来就是真正注入的方法,在BeanWrapper的setPropertyValues中实现的,具体是在BeanWrapperImpl中实现的。

5、通过bw.setPropertyValues方法,遍历所有的PropertyValue,挨个进行设置

6、最终在BeanWrapperImpl中的setValue方法中,通过反射进行注入

总结:

在Bean的创建爱你和对象依赖注入的过程中,需要依据BeanDefinition中的信息来递归地完成依赖注入。从上面的几个递归过程中可以看到,这些递归都是以getBean为入口的。

一个递归是在上下文体系中查找需要的Bean和创建Bean的递归调用;另一个递归是在依赖注入时,通过递归调用容器的getBean方法,得到当前Bean的依赖Bean,同时也触发对依赖Bean的创建和注入。

在对Bean的属性进行依赖注入时,解析的过程也是一个递归的过程。这样,根据依赖关系,一层一层地完成Bean的创建和注入,直到最后完成当前Bean的创建。有了这个顶层Bean的创建和对它的属性依赖注入的完成,意味着和当前Bean相关的整个依赖链的注入也完成了。

源码

BeanFactory中定义了getBean方法,依赖注入正是通过getBean方法触发

public interface BeanFactory {
    
    
    String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;

    <T> ObjectProvider<T> getBeanProvider(Class<T> var1);

    <T> ObjectProvider<T> getBeanProvider(ResolvableType var1);

    boolean containsBean(String var1);

    boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;

    boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;

    String[] getAliases(String var1);
}

doGetBean方法源码

    protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) throws BeansException {
    
    
        String beanName = this.transformedBeanName(name);
        // 先从缓存中取得Bean,处理那些已经被创建过的单件模式的Bean,对这种Bean的请求不需要重复的创建
        Object sharedInstance = this.getSingleton(beanName);
        Object bean;
        if (sharedInstance != null && args == null) {
    
    
            if (this.logger.isTraceEnabled()) {
    
    
                if (this.isSingletonCurrentlyInCreation(beanName)) {
    
    
                    this.logger.trace("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference");
                } else {
    
    
                    this.logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
                }
            }

			// 如果从缓存中获得Bean,通过getObjectForBeanInstance方法完成FactoryBean的相关处理,
			// 取得FactoryBean的处理结果。
            bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, (RootBeanDefinition)null);
        } else {
    
    
            if (this.isPrototypeCurrentlyInCreation(beanName)) {
    
    
                throw new BeanCurrentlyInCreationException(beanName);
            }

			// 如果从缓存中未获得Bean,并且双亲BeanFactory不为null。
			// 检查当前IoC容器中是否存在对应的BeanDefinition,也就是检查是否能在当前的BeanFactory的Map中取得需要的Bean。
            BeanFactory parentBeanFactory = this.getParentBeanFactory();
            if (parentBeanFactory != null && !this.containsBeanDefinition(beanName)) {
    
    
            	// 如果在当前的BeanFactory工厂中取不到BeanDefinition,则到双亲BeanFactory中取,
            	// 也就是调用双亲BeanFactory的getBean方法。如果在当前的双亲工厂中还取不到,
            	// 则递归顺着双亲BeanFactory链一直向上查找。

                String nameToLookup = this.originalBeanName(name);
                if (parentBeanFactory instanceof AbstractBeanFactory) {
    
    
                    return ((AbstractBeanFactory)parentBeanFactory).doGetBean(nameToLookup, requiredType, args, typeCheckOnly);
                }

                if (args != null) {
    
    
                    return parentBeanFactory.getBean(nameToLookup, args);
                }

                if (requiredType != null) {
    
    
                    return parentBeanFactory.getBean(nameToLookup, requiredType);
                }

                return parentBeanFactory.getBean(nameToLookup);
            }

            if (!typeCheckOnly) {
    
    
                this.markBeanAsCreated(beanName);
            }

			// 如果双亲BeanFactory为null,或者当前IoC容器中存在对应的BeanDefinition,
			// 根据Bean的名称获取BeanDefinition。
            try {
    
    
                RootBeanDefinition mbd = this.getMergedLocalBeanDefinition(beanName);
                this.checkMergedBeanDefinition(mbd, beanName, args);
                String[] dependsOn = mbd.getDependsOn();
                String[] var11;
                if (dependsOn != null) {
    
    
                    var11 = dependsOn;
                    int var12 = dependsOn.length;

					// 获取当前Bean的所有依赖的Bean名称,把依赖的Bean注册到dependentBeanMap中。
					// 并调用getBean方法注册每个依赖Bean的依赖Bean。
                    for(int var13 = 0; var13 < var12; ++var13) {
    
    
                        String dep = var11[var13];
                        if (this.isDependent(beanName, dep)) {
    
    
                            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                        }

                        this.registerDependentBean(dep, beanName);

                        try {
    
    
                            this.getBean(dep);
                        } catch (NoSuchBeanDefinitionException var24) {
    
    
                            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "'" + beanName + "' depends on missing bean '" + dep + "'", var24);
                        }
                    }
                }

				// 判断Bean是Singleton还是Prototype,通过调用createBean方法创建Bean实例,
				// 通过getObjectForBeanInstance方法完成FactoryBean的相关处理。
                if (mbd.isSingleton()) {
    
    
                    sharedInstance = this.getSingleton(beanName, () -> {
    
    
                        try {
    
    
                            return this.createBean(beanName, mbd, args);
                        } catch (BeansException var5) {
    
    
                            this.destroySingleton(beanName);
                            throw var5;
                        }
                    });
                    bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
                } else if (mbd.isPrototype()) {
    
    
                    var11 = null;

                    Object prototypeInstance;
                    try {
    
    
                        this.beforePrototypeCreation(beanName);
                        prototypeInstance = this.createBean(beanName, mbd, args);
                    } finally {
    
    
                        this.afterPrototypeCreation(beanName);
                    }

                    bean = this.getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
                } else {
    
    
                    String scopeName = mbd.getScope();
                    if (!StringUtils.hasLength(scopeName)) {
    
    
                        throw new IllegalStateException("No scope name defined for bean ��" + beanName + "'");
                    }

                    Scope scope = (Scope)this.scopes.get(scopeName);
                    if (scope == null) {
    
    
                        throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
                    }

                    try {
    
    
                        Object scopedInstance = scope.get(beanName, () -> {
    
    
                            this.beforePrototypeCreation(beanName);

                            Object var4;
                            try {
    
    
                                var4 = this.createBean(beanName, mbd, args);
                            } finally {
    
    
                                this.afterPrototypeCreation(beanName);
                            }

                            return var4;
                        });
                        bean = this.getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
                    } catch (IllegalStateException var23) {
    
    
                        throw new BeanCreationException(beanName, "Scope '" + scopeName + "' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton", var23);
                    }
                }
            } catch (BeansException var26) {
    
    
                this.cleanupAfterBeanCreationFailure(beanName);
                throw var26;
            }
        }

		// 最后对Bean进行类型检查,如果没问题,
		// 则返回这个新创建的Bean,这个Bean是包含了依赖关系的Bean。
        if (requiredType != null && !requiredType.isInstance(bean)) {
    
    
            try {
    
    
                T convertedBean = this.getTypeConverter().convertIfNecessary(bean, requiredType);
                if (convertedBean == null) {
    
    
                    throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
                } else {
    
    
                    return convertedBean;
                }
            } catch (TypeMismatchException var25) {
    
    
                if (this.logger.isTraceEnabled()) {
    
    
                    this.logger.trace("Failed to convert bean '" + name + "' to required type '" + ClassUtils.getQualifiedName(requiredType) + "'", var25);
                }

                throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
            }
        } else {
    
    
            return bean;
        }
    }

createBean方法

    protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
    
    
        if (this.logger.isTraceEnabled()) {
    
    
            this.logger.trace("Creating instance of bean '" + beanName + "'");
        }

        RootBeanDefinition mbdToUse = mbd;
        Class<?> resolvedClass = this.resolveBeanClass(mbd, beanName, new Class[0]);
        if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
    
    
            mbdToUse = new RootBeanDefinition(mbd);
            mbdToUse.setBeanClass(resolvedClass);
        }

        try {
    
    
            mbdToUse.prepareMethodOverrides();
        } catch (BeanDefinitionValidationException var9) {
    
    
            throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(), beanName, "Validation of method overrides failed", var9);
        }

        Object beanInstance;
        try {
    
    
            beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);
            if (beanInstance != null) {
    
    
                return beanInstance;
            }
        } catch (Throwable var10) {
    
    
            throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var10);
        }

        try {
    
    
            beanInstance = this.doCreateBean(beanName, mbdToUse, args);
            if (this.logger.isTraceEnabled()) {
    
    
                this.logger.trace("Finished creating instance of bean '" + beanName + "'");
            }

            return beanInstance;
        } catch (ImplicitlyAppearedSingletonException | BeanCreationException var7) {
    
    
            throw var7;
        } catch (Throwable var8) {
    
    
            throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", var8);
        }
    }

doCreateBean方法

    protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
    
    
        BeanWrapper instanceWrapper = null;
        if (mbd.isSingleton()) {
    
    
            instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);
        }

        if (instanceWrapper == null) {
    
    
            instanceWrapper = this.createBeanInstance(beanName, mbd, args);
        }

        Object bean = instanceWrapper.getWrappedInstance();
        Class<?> beanType = instanceWrapper.getWrappedClass();
        if (beanType != NullBean.class) {
    
    
            mbd.resolvedTargetType = beanType;
        }

        synchronized(mbd.postProcessingLock) {
    
    
            if (!mbd.postProcessed) {
    
    
                try {
    
    
                    this.applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
                } catch (Throwable var17) {
    
    
                    throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Post-processing of merged bean definition failed", var17);
                }

                mbd.postProcessed = true;
            }
        }

        boolean earlySingletonExposure = mbd.isSingleton() && this.allowCircularReferences && this.isSingletonCurrentlyInCreation(beanName);
        if (earlySingletonExposure) {
    
    
            if (this.logger.isTraceEnabled()) {
    
    
                this.logger.trace("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references");
            }

            this.addSingletonFactory(beanName, () -> {
    
    
                return this.getEarlyBeanReference(beanName, mbd, bean);
            });
        }

        Object exposedObject = bean;

        try {
    
    
            this.populateBean(beanName, mbd, instanceWrapper);
            exposedObject = this.initializeBean(beanName, exposedObject, mbd);
        } catch (Throwable var18) {
    
    
            if (var18 instanceof BeanCreationException && beanName.equals(((BeanCreationException)var18).getBeanName())) {
    
    
                throw (BeanCreationException)var18;
            }

            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", var18);
        }

        if (earlySingletonExposure) {
    
    
            Object earlySingletonReference = this.getSingleton(beanName, false);
            if (earlySingletonReference != null) {
    
    
                if (exposedObject == bean) {
    
    
                    exposedObject = earlySingletonReference;
                } else if (!this.allowRawInjectionDespiteWrapping && this.hasDependentBean(beanName)) {
    
    
                    String[] dependentBeans = this.getDependentBeans(beanName);
                    Set<String> actualDependentBeans = new LinkedHashSet(dependentBeans.length);
                    String[] var12 = dependentBeans;
                    int var13 = dependentBeans.length;

                    for(int var14 = 0; var14 < var13; ++var14) {
    
    
                        String dependentBean = var12[var14];
                        if (!this.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 'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.");
                    }
                }
            }
        }

        try {
    
    
            this.registerDisposableBeanIfNecessary(beanName, bean, mbd);
            return exposedObject;
        } catch (BeanDefinitionValidationException var16) {
    
    
            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", var16);
        }
    }

createBeanInstance方法创建对象

    protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
    
    
        Class<?> beanClass = this.resolveBeanClass(mbd, beanName, new Class[0]);
        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());
        } else {
    
    
            Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
            if (instanceSupplier != null) {
    
    
                return this.obtainFromSupplier(instanceSupplier, beanName);
            } else if (mbd.getFactoryMethodName() != null) {
    
    
                return this.instantiateUsingFactoryMethod(beanName, mbd, args);
            } else {
    
    
                boolean resolved = false;
                boolean autowireNecessary = false;
                if (args == null) {
    
    
                    synchronized(mbd.constructorArgumentLock) {
    
    
                        if (mbd.resolvedConstructorOrFactoryMethod != null) {
    
    
                            resolved = true;
                            autowireNecessary = mbd.constructorArgumentsResolved;
                        }
                    }
                }

                if (resolved) {
    
    
                    return autowireNecessary ? this.autowireConstructor(beanName, mbd, (Constructor[])null, (Object[])null) : this.instantiateBean(beanName, mbd);
                } else {
    
    
                    Constructor<?>[] ctors = this.determineConstructorsFromBeanPostProcessors(beanClass, beanName);
                    if (ctors == null && mbd.getResolvedAutowireMode() != 3 && !mbd.hasConstructorArgumentValues() && ObjectUtils.isEmpty(args)) {
    
    
                        ctors = mbd.getPreferredConstructors();
                        return ctors != null ? this.autowireConstructor(beanName, mbd, ctors, (Object[])null) : this.instantiateBean(beanName, mbd);
                    } else {
    
    
                        return this.autowireConstructor(beanName, mbd, ctors, args);
                    }
                }
            }
        }
    }

instantiateBean方法

    protected BeanWrapper instantiateBean(String beanName, RootBeanDefinition mbd) {
    
    
        try {
    
    
            Object beanInstance;
            if (System.getSecurityManager() != null) {
    
    
                beanInstance = AccessController.doPrivileged(() -> {
    
    
                    return this.getInstantiationStrategy().instantiate(mbd, beanName, this);
                }, this.getAccessControlContext());
            } else {
    
    
                beanInstance = this.getInstantiationStrategy().instantiate(mbd, beanName, this);
            }

            BeanWrapper bw = new BeanWrapperImpl(beanInstance);
            this.initBeanWrapper(bw);
            return bw;
        } catch (Throwable var5) {
    
    
            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Instantiation of bean failed", var5);
        }
    }

通过反射创建对象

BeanUtils.instantiateClass(constructorToUse, new Object[0])

    public static <T> T instantiateClass(Constructor<T> ctor, Object... args) throws BeanInstantiationException {
    
    
        Assert.notNull(ctor, "Constructor must not be null");

        try {
    
    
            ReflectionUtils.makeAccessible(ctor);
            if (KotlinDetector.isKotlinReflectPresent() && KotlinDetector.isKotlinType(ctor.getDeclaringClass())) {
    
    
                return BeanUtils.KotlinDelegate.instantiateClass(ctor, args);
            } else {
    
    
                Class<?>[] parameterTypes = ctor.getParameterTypes();
                Assert.isTrue(args.length <= parameterTypes.length, "Can't specify more arguments than constructor parameters");
                Object[] argsWithDefaultValues = new Object[args.length];

                for(int i = 0; i < args.length; ++i) {
    
    
                    if (args[i] == null) {
    
    
                        Class<?> parameterType = parameterTypes[i];
                        argsWithDefaultValues[i] = parameterType.isPrimitive() ? DEFAULT_TYPE_VALUES.get(parameterType) : null;
                    } else {
    
    
                        argsWithDefaultValues[i] = args[i];
                    }
                }

                return ctor.newInstance(argsWithDefaultValues);
            }
        } catch (InstantiationException var6) {
    
    
            throw new BeanInstantiationException(ctor, "Is it an abstract class?", var6);
        } catch (IllegalAccessException var7) {
    
    
            throw new BeanInstantiationException(ctor, "Is the constructor accessible?", var7);
        } catch (IllegalArgumentException var8) {
    
    
            throw new BeanInstantiationException(ctor, "Illegal arguments for constructor", var8);
        } catch (InvocationTargetException var9) {
    
    
            throw new BeanInstantiationException(ctor, "Constructor threw exception", var9.getTargetException());
        }
    }

通过CGLIB创建对象

this.instantiateWithMethodInjection(bd, beanName, owner)

    protected Object instantiateWithMethodInjection(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
    
    
        return this.instantiateWithMethodInjection(bd, beanName, owner, (Constructor)null);
    }

    protected Object instantiateWithMethodInjection(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner, @Nullable Constructor<?> ctor, Object... args) {
    
    
        return (new CglibSubclassingInstantiationStrategy.CglibSubclassCreator(bd, owner)).instantiate(ctor, args);
    }
        public Object instantiate(@Nullable Constructor<?> ctor, Object... args) {
    
    
            Class<?> subclass = this.createEnhancedSubclass(this.beanDefinition);
            Object instance;
            if (ctor == null) {
    
    
                instance = BeanUtils.instantiateClass(subclass);
            } else {
    
    
                try {
    
    
                    Constructor<?> enhancedSubclassConstructor = subclass.getConstructor(ctor.getParameterTypes());
                    instance = enhancedSubclassConstructor.newInstance(args);
                } catch (Exception var6) {
    
    
                    throw new BeanInstantiationException(this.beanDefinition.getBeanClass(), "Failed to invoke constructor for CGLIB enhanced subclass [" + subclass.getName() + "]", var6);
                }
            }

            Factory factory = (Factory)instance;
            factory.setCallbacks(new Callback[]{
    
    NoOp.INSTANCE, new CglibSubclassingInstantiationStrategy.LookupOverrideMethodInterceptor(this.beanDefinition, this.owner), new CglibSubclassingInstantiationStrategy.ReplaceOverrideMethodInterceptor(this.beanDefinition, this.owner)});
            return instance;
        }

createEnhancedSubclass方法

        private Class<?> createEnhancedSubclass(RootBeanDefinition beanDefinition) {
    
    
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(beanDefinition.getBeanClass());
            enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
            if (this.owner instanceof ConfigurableBeanFactory) {
    
    
                ClassLoader cl = ((ConfigurableBeanFactory)this.owner).getBeanClassLoader();
                enhancer.setStrategy(new ClassLoaderAwareGeneratorStrategy(cl));
            }

            enhancer.setCallbackFilter(new CglibSubclassingInstantiationStrategy.MethodOverrideCallbackFilter(beanDefinition));
            enhancer.setCallbackTypes(CALLBACK_TYPES);
            return enhancer.createClass();
        }

populateBean方法设置依赖关系

populateBean方法

    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 {
    
    
            if (!mbd.isSynthetic() && this.hasInstantiationAwareBeanPostProcessors()) {
    
    
                Iterator var4 = this.getBeanPostProcessors().iterator();

                while(var4.hasNext()) {
    
    
                    BeanPostProcessor bp = (BeanPostProcessor)var4.next();
                    if (bp instanceof InstantiationAwareBeanPostProcessor) {
    
    
                        InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor)bp;
                        if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
    
    
                            return;
                        }
                    }
                }
            }

            PropertyValues pvs = mbd.hasPropertyValues() ? mbd.getPropertyValues() : null;
            int resolvedAutowireMode = mbd.getResolvedAutowireMode();
            if (resolvedAutowireMode == 1 || resolvedAutowireMode == 2) {
    
    
                MutablePropertyValues newPvs = new MutablePropertyValues((PropertyValues)pvs);
                if (resolvedAutowireMode == 1) {
    
    
                    this.autowireByName(beanName, mbd, bw, newPvs);
                }

                if (resolvedAutowireMode == 2) {
    
    
                    this.autowireByType(beanName, mbd, bw, newPvs);
                }

                pvs = newPvs;
            }

            boolean hasInstAwareBpps = this.hasInstantiationAwareBeanPostProcessors();
            boolean needsDepCheck = mbd.getDependencyCheck() != 0;
            PropertyDescriptor[] filteredPds = null;
            if (hasInstAwareBpps) {
    
    
                if (pvs == null) {
    
    
                    pvs = mbd.getPropertyValues();
                }

                Iterator var9 = this.getBeanPostProcessors().iterator();

                while(var9.hasNext()) {
    
    
                    BeanPostProcessor bp = (BeanPostProcessor)var9.next();
                    if (bp instanceof InstantiationAwareBeanPostProcessor) {
    
    
                        InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor)bp;
                        PropertyValues pvsToUse = ibp.postProcessProperties((PropertyValues)pvs, bw.getWrappedInstance(), beanName);
                        if (pvsToUse == null) {
    
    
                            if (filteredPds == null) {
    
    
                                filteredPds = this.filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                            }

                            pvsToUse = ibp.postProcessPropertyValues((PropertyValues)pvs, filteredPds, bw.getWrappedInstance(), beanName);
                            if (pvsToUse == null) {
    
    
                                return;
                            }
                        }

                        pvs = pvsToUse;
                    }
                }
            }

            if (needsDepCheck) {
    
    
                if (filteredPds == null) {
    
    
                    filteredPds = this.filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                }

                this.checkDependencies(beanName, mbd, filteredPds, (PropertyValues)pvs);
            }

            if (pvs != null) {
    
    
                this.applyPropertyValues(beanName, mbd, bw, (PropertyValues)pvs);
            }

        }
    }

applyPropertyValues方法

    protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {
    
    
        if (!pvs.isEmpty()) {
    
    
            if (System.getSecurityManager() != null && bw instanceof BeanWrapperImpl) {
    
    
                ((BeanWrapperImpl)bw).setSecurityContext(this.getAccessControlContext());
            }

            MutablePropertyValues mpvs = null;
            List original;
            if (pvs instanceof MutablePropertyValues) {
    
    
                mpvs = (MutablePropertyValues)pvs;
                if (mpvs.isConverted()) {
    
    
                    try {
    
    
                        bw.setPropertyValues(mpvs);
                        return;
                    } catch (BeansException var18) {
    
    
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Error setting property values", var18);
                    }
                }

                original = mpvs.getPropertyValueList();
            } else {
    
    
                original = Arrays.asList(pvs.getPropertyValues());
            }

            TypeConverter converter = this.getCustomTypeConverter();
            if (converter == null) {
    
    
                converter = bw;
            }

            BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, (TypeConverter)converter);
            List<PropertyValue> deepCopy = new ArrayList(original.size());
            boolean resolveNecessary = false;
            Iterator var11 = original.iterator();

            while(true) {
    
    
                while(var11.hasNext()) {
    
    
                    PropertyValue pv = (PropertyValue)var11.next();
                    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 = this.convertForProperty(resolvedValue, propertyName, bw, (TypeConverter)converter);
                        }

                        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();
                }

                try {
    
    
                    bw.setPropertyValues(new MutablePropertyValues(deepCopy));
                    return;
                } catch (BeansException var19) {
    
    
                    throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Error setting property values", var19);
                }
            }
        }
    }

resolveValueIfNecessary方法

    public Object resolveValueIfNecessary(Object argName, @Nullable Object value) {
    
    
        if (value instanceof RuntimeBeanReference) {
    
    
            RuntimeBeanReference ref = (RuntimeBeanReference)value;
            return this.resolveReference(argName, ref);
        } else if (value instanceof RuntimeBeanNameReference) {
    
    
            String refName = ((RuntimeBeanNameReference)value).getBeanName();
            refName = String.valueOf(this.doEvaluate(refName));
            if (!this.beanFactory.containsBean(refName)) {
    
    
                throw new BeanDefinitionStoreException("Invalid bean name '" + refName + "' in bean reference for " + argName);
            } else {
    
    
                return refName;
            }
        } else if (value instanceof BeanDefinitionHolder) {
    
    
            BeanDefinitionHolder bdHolder = (BeanDefinitionHolder)value;
            return this.resolveInnerBean(argName, bdHolder.getBeanName(), bdHolder.getBeanDefinition());
        } else if (value instanceof BeanDefinition) {
    
    
            BeanDefinition bd = (BeanDefinition)value;
            String innerBeanName = "(inner bean)#" + ObjectUtils.getIdentityHexString(bd);
            return this.resolveInnerBean(argName, innerBeanName, bd);
        } else {
    
    
            Object valueObject;
            if (value instanceof DependencyDescriptor) {
    
    
                Set<String> autowiredBeanNames = new LinkedHashSet(4);
                valueObject = this.beanFactory.resolveDependency((DependencyDescriptor)value, this.beanName, autowiredBeanNames, this.typeConverter);
                Iterator var19 = autowiredBeanNames.iterator();

                while(var19.hasNext()) {
    
    
                    String autowiredBeanName = (String)var19.next();
                    if (this.beanFactory.containsBean(autowiredBeanName)) {
    
    
                        this.beanFactory.registerDependentBean(autowiredBeanName, this.beanName);
                    }
                }

                return valueObject;
            } else if (value instanceof ManagedArray) {
    
    
                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 var7) {
    
    
                            throw new BeanCreationException(this.beanDefinition.getResourceDescription(), this.beanName, "Error resolving array type for " + argName, var7);
                        }
                    } else {
    
    
                        elementType = Object.class;
                    }
                }

                return this.resolveManagedArray(argName, (List)value, elementType);
            } else if (value instanceof ManagedList) {
    
    
                return this.resolveManagedList(argName, (List)value);
            } else if (value instanceof ManagedSet) {
    
    
                return this.resolveManagedSet(argName, (Set)value);
            } else if (value instanceof ManagedMap) {
    
    
                return this.resolveManagedMap(argName, (Map)value);
            } else if (value instanceof ManagedProperties) {
    
    
                Properties original = (Properties)value;
                Properties copy = new Properties();
                original.forEach((propKey, propValue) -> {
    
    
                    if (propKey instanceof TypedStringValue) {
    
    
                        propKey = this.evaluate((TypedStringValue)propKey);
                    }

                    if (propValue instanceof TypedStringValue) {
    
    
                        propValue = this.evaluate((TypedStringValue)propValue);
                    }

                    if (propKey != null && propValue != null) {
    
    
                        copy.put(propKey, propValue);
                    } else {
    
    
                        throw new BeanCreationException(this.beanDefinition.getResourceDescription(), this.beanName, "Error converting Properties key/value pair for " + argName + ": resolved to null");
                    }
                });
                return copy;
            } else if (value instanceof TypedStringValue) {
    
    
                TypedStringValue typedStringValue = (TypedStringValue)value;
                valueObject = this.evaluate(typedStringValue);

                try {
    
    
                    Class<?> resolvedTargetType = this.resolveTargetType(typedStringValue);
                    return resolvedTargetType != null ? this.typeConverter.convertIfNecessary(valueObject, resolvedTargetType) : valueObject;
                } catch (Throwable var8) {
    
    
                    throw new BeanCreationException(this.beanDefinition.getResourceDescription(), this.beanName, "Error converting typed String value for " + argName, var8);
                }
            } else {
    
    
                return value instanceof NullBean ? null : this.evaluate(value);
            }
        }
    }

resolveReference方法

applyPropertyValues方法调用了resolveValueIfNecessary方法,resolveValueIfNecessary方法调用了resolveReference方法

    private Object resolveReference(Object argName, RuntimeBeanReference ref) {
    
    
        try {
    
    
            Class<?> beanType = ref.getBeanType();
            Object bean;
            if (ref.isToParent()) {
    
    
                BeanFactory parent = this.beanFactory.getParentBeanFactory();
                if (parent == null) {
    
    
                    throw new BeanCreationException(this.beanDefinition.getResourceDescription(), this.beanName, "Cannot resolve reference to bean " + ref + " in parent factory: no parent factory available");
                }

                if (beanType != null) {
    
    
                    bean = parent.getBean(beanType);
                } else {
    
    
                    bean = parent.getBean(String.valueOf(this.doEvaluate(ref.getBeanName())));
                }
            } else {
    
    
                String resolvedName;
                if (beanType != null) {
    
    
                    NamedBeanHolder<?> namedBean = this.beanFactory.resolveNamedBean(beanType);
                    bean = namedBean.getBeanInstance();
                    resolvedName = namedBean.getBeanName();
                } else {
    
    
                    resolvedName = String.valueOf(this.doEvaluate(ref.getBeanName()));
                    bean = this.beanFactory.getBean(resolvedName);
                }

                this.beanFactory.registerDependentBean(resolvedName, this.beanName);
            }

            if (bean instanceof NullBean) {
    
    
                bean = null;
            }

            return bean;
        } catch (BeansException var7) {
    
    
            throw new BeanCreationException(this.beanDefinition.getResourceDescription(), this.beanName, "Cannot resolve reference to bean '" + ref.getBeanName() + "' while setting " + argName, var7);
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_43073775/article/details/117398956