22.spring源码之Bean的实例化过程
之前的spring容器加载核心方法refresh()方法中大部分方法都讲了,但是还有一个非常重要的方法没讲,Bean的实例化、依赖注入、AOP都是在这个方法中完成。
1.进入上下文的refresh()方法


2.进入finishBeanFactoryInitialization()方法

3.进入preInstantiateSingletons()方法


4.进入getBean()方法

5.进入doGetBean()方法



5.1看最上面的getSingleton(beanName)方法

进入getSingleton()方法,从缓存中拿实例对象

5.2如果缓存中没有该实例对象,进入第二个getSingleton()方法


把实例添加到一级缓存,上面有段代码调用getObject()方法会执行外层方法的lambda表达式,于是会执行createBean()方法,去创建实例并返回,然后添加到一级缓存。

6.进入createBean()方法


7.进入doCreateBean()方法
最核心的方法,Bean的实例化、收集注解、把实例对象添加三级缓存、依赖注入、AOP、Bean的销毁等





7.1.进入createBeanInstance()方法


7.1.1factoryMethod方法,进入instantiateUsingFactoryMethod()方法

进入instantiateUsingFactoryMethod()方法




进入instantiate()方法

进入instantiate()方法

7.1.2寻找所有的构造方法,进入determineConstructorsFrrmBeanPostProcessors()方法
这是一个BeanPostProcessor的应用

进入determineCandidateConstructors()方法




7.1.3上一步返回构造函数后,调用autowiredConstructor()方法进行构造方法实例化

进入autowirdConstructor()方法





进入反射实例化方法instantiate()

进入instantiate()方法

进入instantiateClass()方法

如果构造函数中有参数,会触发参数的getBean操作,进入createArgumentArray()方法

进入resolveAutowiredArgument()方法

进入resolveDependency()方法

进入doResolveDependency()方法

进入resolveCandidate()方法,完成对构造方法中参数的实例化

7.1.4如果7.1.2中没有收集到构造方法,调用instantiateBean()方法进行无参构造方法实例化

进入instantiate()方法

进入instantiateClass()方法

总结,实例化方法可以分为以下4种:
1.factoryMethod方法分两种
一,有factoryBeanName



二,没有factoryBeanName


2.有@Autowired注解的有参构造方法
只有一个构造方法

有多个构造方法,required需设置为false

3.没有注解的有参构造方法
只能一个构造有方法,如果有多个,必须加上一个无参构造方法

4.无参构造方法

8.再回到7中的doCreateBean()方法
在createBeanInstance()这个方法完成了Bena的实例化,但是这个时候仅仅是完成了实例化,对象中注入属性什么都是没有值的,接着往后面看


进入appleMergedBeanDefinitionPostProcessors()方法,这是一个MergedBeanDefinitionPostProcessor类型的BeanPostProcessors的应用,循环的对BeanDefinition进行装饰

8.1进入AutowiredAnnotationBeanPostProcessor类的postProcessMergedBeanDefinition()方法完成@Autowired,@Value注解属性和方法的收集

进入findAutowireingMetadata()方法

进入到buildAutowiringMetadata()方法


进入findAutowiredAnnotation()方法


8.2CommonAnnotationBeanPostProcessor的postProcessMergedBeanDefinition()方法完成@Resource属性和方法的收集

进入findResourecMetadata()方法

进入buildResourceMetadata()方法


8.3InitDestroyAnnotationBeanPostProcessor类postProcessMergerBeanDefinition()方法完成@PostConstruct,@PreDestroy注解方法的收集

进入findLifecycleMetadata()方法

进入buildLifecycleMetadata()方法


9.回到7中的doCreateBean()方法
在7中完成了Bean的实例化,在8中完成了该Bean注解的收集,接着代码往下看


9.1进入addSingletonFactory()方法
添加到三级缓存,key是beanName,value是一个ObjectFactory类型lambda表达式,当调用ObjectFactory的getObject方法时,会执行这个lambda表达式的代码

进入getEarlyBeanRefrence()方法,这里是一个BeanPostProcessor的应用,如果没有切面,会直接返回这个bean。

Bean的实例化过程还没完,在5.2中调用getObject()方法返回实例,把正在实例化的类的beanName从容器中移除,并且把实例添加到一级缓存,整个Bean的实例化才算结束,现在完成了实例化、注解的收集,并添加到三级缓存,注意添加到三级缓存的条件是单例、允许循环依赖(默认为true),且正在实例化(正在实例化的那个容器中还有当前的beanName),接下来就是把收集到的属性方法进行依赖注入,下篇文章再讲。
浙公网安备 33010602011771号