如何快速的建设网站,如何创建wordpress数据库文件,简单网页编辑软件,网站做啥内容用户多接上篇Spring源码之IoC容器初始化过程#xff0c;以FileSystemXmlApplicationContext容器为例 因为FileSystemXmlApplicationContext使用的容器为DefaultListableBeanFactory#xff0c;所以该篇基于DefaultListableBeanFactory的实现分析依赖注入过程。 目录获取Bean的总体流…接上篇Spring源码之IoC容器初始化过程以FileSystemXmlApplicationContext容器为例 因为FileSystemXmlApplicationContext使用的容器为DefaultListableBeanFactory所以该篇基于DefaultListableBeanFactory的实现分析依赖注入过程。 
目录获取Bean的总体流程Bean对象的实例化Bean对象依赖关系的注入总结源码doGetBean方法源码createBean方法doCreateBean方法createBeanInstance方法创建对象instantiateBean方法通过反射创建对象通过CGLIB创建对象createEnhancedSubclass方法populateBean方法设置依赖关系populateBean方法applyPropertyValues方法resolveValueIfNecessary方法resolveReference方法获取Bean的总体流程 
getBean流程 依赖注入通过BeanFactory的getBean方法触发。 DefaultListableBeanFactory的getBean方法通过继承AbstractAutowireCapableBeanFactoryAbstractAutowireCapableBeanFactory继承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, ClassT var2) throws BeansException;Object getBean(String var1, Object... var2) throws BeansException;T T getBean(ClassT var1) throws BeansException;T T getBean(ClassT var1, Object... var2) throws BeansException;T ObjectProviderT getBeanProvider(ClassT var1);T ObjectProviderT 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;NullableClass? getType(String var1) throws NoSuchBeanDefinitionException;NullableClass? getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;String[] getAliases(String var1);
}doGetBean方法源码 protected T T doGetBean(String name, Nullable ClassT 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);SetString 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 isnt 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(ConstructorT 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, Cant 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);ListPropertyValue 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) {SetString 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);}}