程序笔记   发布时间:2022-07-13  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了22.spring源码之Bean的实例化过程大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

1.进入上下文的refresh()方法

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

2.进入finishBeanFactoryInitialization()方法

22.spring源码之Bean的实例化过程

3.进入preInstantiateSingletons()方法

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

4.进入getBean()方法

22.spring源码之Bean的实例化过程

5.进入doGetBean()方法

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

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

22.spring源码之Bean的实例化过程

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

22.spring源码之Bean的实例化过程

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

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

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

22.spring源码之Bean的实例化过程

6.进入createBean()方法

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

7.进入doCreateBean()方法

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

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

8.进入createBeanInstance()方法

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

 

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

22.spring源码之Bean的实例化过程

进入instantiateUsingFactoryMethod()方法

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

进入instantiate()方法

22.spring源码之Bean的实例化过程

进入instantiate()方法

22.spring源码之Bean的实例化过程

8.2寻找所有的构造方法,进入determineConstructorsFrrmBeanPostProcessors()方法

这是一个BeanPostProcessor的应用

22.spring源码之Bean的实例化过程

进入determineCandidateConstructors()方法

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

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

22.spring源码之Bean的实例化过程

进入autowirdConstructor()方法

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

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

22.spring源码之Bean的实例化过程

进入instantiate()方法

22.spring源码之Bean的实例化过程

进入instantiateClass()方法

22.spring源码之Bean的实例化过程

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

22.spring源码之Bean的实例化过程

进入resolveAutowiredArgument()方法

22.spring源码之Bean的实例化过程

进入resolveDependency()方法

22.spring源码之Bean的实例化过程

进入doResolveDependency()方法

22.spring源码之Bean的实例化过程

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

22.spring源码之Bean的实例化过程

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

22.spring源码之Bean的实例化过程

进入instantiate()方法

22.spring源码之Bean的实例化过程

进入instantiateClass()方法

22.spring源码之Bean的实例化过程

 

9.总结,实例化方法可以分为以下4种:

1.factoryMethod方法分两种

一,有factoryBeanName

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

二,没有factoryBeanName

22.spring源码之Bean的实例化过程

22.spring源码之Bean的实例化过程

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

只有一个构造方法

22.spring源码之Bean的实例化过程

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

22.spring源码之Bean的实例化过程

3.没有注解的有参构造方法

只能一个构造有方法,如果有多个,必须加上一个无参构造方法

22.spring源码之Bean的实例化过程

4.无参构造方法

22.spring源码之Bean的实例化过程

 

大佬总结

以上是大佬教程为你收集整理的22.spring源码之Bean的实例化过程全部内容,希望文章能够帮你解决22.spring源码之Bean的实例化过程所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: