BeanFactory和ApplicationContext接口

7.BeanFactory和ApplicationContext接口

BeanFactory接口 bean工厂, 提供getBean方法
ApplicationContext子接口 beanFactory的子接口,多一个refresh方法

AbstractApplicationContext

子实现类

内置类路径,

配置文件解析器,

存bean实例的singletonMap

<String,Bean>

内置类路径和解析器,重写refresh方法

refresh=

1.调用解析器的loadBeanDefinition

2.调用finishBeanInitialization(

获取注册表,并且遍历getBeanByName

)

image1

ClassPathXmlApplicationContext子类

1.在构造函数调用refresh进行bean的实例化
a.读取xml文件并且添加所有bean进注册表
b.finishBeanDefinitionIntialization-->for循环getBean预热所有bean

注意这里的getBean方法会将实例化后的bean存放进singletonMap

于是下次我们调用这个方法的时候会refresh,然后map就装满了bean对象

重写getBean方法

1.查找singletonMap是否存有该Bean,有则返回

2.没有, 那么我们通过BeanDefinitionRegistry找到该BeanDefinition

image2

3.BeanDefinition中保存了name, 因此我们通过反射newInstance

3.1 最重要的是进行依赖注入: properties

4.最后,走到这里说明singletonMap中没存该bean,

我们存入singletonMap,这样下次就不用再创建了,可以直接返回

5.注意这个方法是getBean, 到底是要返回Bean的!!!!!!!!!!!