Spring IoC初始化中我们知道了,spring把配置文件中的信息读取到BeanDefinition中,但是没有初始化,而是把信息存储到map中。
真正实例化的时候是在客户通过容器使用这些bean的时候,也就是getbean的时候,在这个过程中完成了实例化以及依赖注入。
我们从AbstractBeanFactory开始看getBean()方法
|
|
下面的doGetBean()方法时真正实现向IoC容器获取Bean的方法,也是触发依赖注入功能的地方。
|
|
通过以上的代码我们可以知道这段代码创建实例前 主要做了两个判断
1、如果Bean定义的单态模式(Singleton),则容器在创建之前先从缓存中查找,以确保整个容器中只存在一个实例对象
2、如果Bean定义的是原型模式(Prototype),则容器每次都会创建一个新的实例对象。
3、两者都不是,则根据Bean定义资源中配置的生命周期范围(如:request、session、application等生命周期),选择实例化Bean的合适方法。
注意:
这里需要了解一下 Spring-bean作用域scope,之后会整理一篇文章。
下面我们进入实际创建bean的代码中,AbstractAutowireCapableBeanFactory类的核心方法createBean()以及doCreateBean()方法。
|
|
上面的方法中调用了两个比较重要的方法:
createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args)和
populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw)
createBeanInstance为指定的bean创建一个新的实例,这个实例可以选择不同的实例化策略:工厂方法,构造函数自动装配,或简单的实例化。
instantiateBean方法继续下去是CGLIB对Bean进行实例化。不是很懂,暂时就到这里,之后研究再补充。
以上我们就完成了实例化Bean的整个过程,下面就要分析如何把实例化后的Bean进行依赖关系设置完成依赖注入。
|
|