这里,看起来有这么多方法,其实初始化的主体逻辑都在
beanFactory.preInstantiateSingletons()中。
这个方式是 Bean 实例化的核心方法。
简单看一下注释,就知道这个方法做了两件事:
我们截取上面方法的实例化部分来分析:
哦豁,这里面分了 工厂Bean 和 普通Bean 采取不同的处理策略。自然是先看 普通Bean 了。
getBean()
下面就来到了真正的逻辑
doGetBean(),但是这个方法太长了,约有150行。如果我觉得不是核心逻辑的语句,我就略去了。
我们继续进入到
createBean(beanName,mbd,args)中:
主要到这里有两个比较重要的方法:
resolveBeforeInstantiation(beanName, mbdToUse) 、
doCreateBean(beanName, mbdToUse, args)。
resolveBeforeInstantiation
很显然,我们一般不会这么搞的。我们日常时候都是直接注解一下就ok,并不会自定义Bean的实例化逻辑。
doCreateBean
这里面呢,有三个主要方法需要我们注意:
createBeanInstance(beanName, mbd, args)、
populateBean(beanName, mbd, instanceWrapper)、
initializeBean(beanName, exposedObject, mbd)。
createBeanInstance
使用适当的实例化策略为指定的bean创建一个新实例。
populateBean
使用Bean定义中的属性值填充给定BeanWrapper中的Bean实例。
initializeBean
初始化给定的bean实例,应用工厂回调以及init方法和bean post处理器。 对于传统定义的bean,从createBean调用,对于现有的bean实例,从initializeBean调用。
createBeanInstance
populateBean
不是重点。
initializeBean
Bean 的实例化总体流程,我们就此走完了。
Bean 的实例化过程,还是非常复杂的。所以我们这节,还是重在总体流程的理解,细枝末节的以后再探究。
在探究 Bean 的实例过程中,我们看到了,很多判断是否实现了某接口,然后调用接口方法的逻辑,例如 BeanPostProcessors。这是 Spring 里非常常用的手法。
最近我整理了整套 《JAVA核心知识点总结》,说实话 ,作为一名Java程序员,不论你需不需要面试都应该好好看下这份资料。拿到手总是不亏的~我的不少粉丝也因此拿到腾讯字节快手等公司的Offer
进 【 Java进阶之路群】,找管理员获取哦-!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70000428/viewspace-2779245/ ,如需转载,请注明出处,否则将追究法律责任。