
回复
作者 |jaxer
来源 | WriteOnRead(ID:WriteOnRead)
主要流程如下:
IoC 容器已经建立,而且把我们定义的 bean 信息放入了容器,那么如何从容器中获取对象呢?
本文继续分析。
配置及测试代码
为便于查看,这里再贴一下 bean 配置文件和测试代码。
配置文件 application-ioc.xml
测试代码
如何从容器获取对象?
从容器中获取对象是通过 BeanFactory#getBean 方法,它有多个重载的方法,但最终都是通过
AbstractBeanFactory#doGetBean 方法来实现的。doGetBean 方法代码如下:
获取 bean 对象主要就是通过这个 doGetBean 方法实现的。
该方法虽然看起来稍微有点长,但是呢,它内部的实现更长、更复杂。不过也是有迹可循的,莫慌。
本文先看下这个方法的整体流程,内部逻辑后面再慢慢研究。先上流程图:
代码虽然有点长,但梳理下来其实也没那么复杂了。
这个方法主要做了什么呢?
当从容器中获取 bean 对象时,首先从缓存中获取。如果缓存中存在,处理 FactoryBean 的场景。
如果缓存中没有,先去父容器获取,前面创建 BeanFactory 时可以指定 parent 参数,就是那个。
不在父容器中,若 bean 对象依赖了其他对象,则先创建被依赖的 bean 对象,再根据 标签的 scope 属性去创建相应的 bean 对象。
道理是一样的,空间换时间。
小结
先整体,后细节。
本文先从整体上分析了如何从 Spring IoC 容器中获取 bean 对象,内容不多,后文再详细分解吧。