对于加载bean的功能,Spring的调用方式是 MyBean bean = bf.getBean("myBean");而我们从这一方法进入寻找bean的加载过程。发现过程如下图所示,共9个步骤
1.转换beanName:传入的参数beanName可能是别名、FactoryBean。FactoryBean解析去掉修饰符,也就是如果是name="&aa",会解析为name="aa";
2.尝试从缓存中加载单例bean:单例在Spring的同一个容器只会创建一次,后续加载从缓存中获取;因为在创建单例bean的时候可能存在依赖注入,而Spring为了避免循环依赖,创建bean的原则是不等bean创建完成,就会将创建bean的beanFactory提前曝光在缓存中,一旦下一个bean需要依赖上一个bean的时候,就直接使用beanFactory。
3.实例化bean:如果从缓存中获取到bean的原始状态,则需要对bean实例化。
4.循环依赖检查:检查当前bean是否存在循环依赖,即bean A 引用bean B,而bean B又引用bean A,则抛出异常
5.检测parentBeanFactory:如果parentBeanFactory不为空,且当前获取不到bean的配置信息,则会从parentBeanFactory中递归寻找。
6.将存储xml配置信息的gernericBeanDefinition转换为RootBeanDefintion:因为所有bean的后续处理都是针对RootBeanDefintion,所以这里需要转换,如果存在parentBean,则将parentBean的配置信息也合并到bean中。
7.寻找依赖:在初始化某一个bean的时候首先会初始化这个bean所对应的依赖。
8.根据不同的scope创建bean:scope包括singleton、request、prototype。默认singleton。
9.类型转换:根据输入的参数转换bean类型。