文章目录
一、Bean 实例化的基本流程
Spring容器在进行初始化时,会将 xml 配置的 < bean>的信息封装成一个 BeanDefinition 对象,所有的 BeanDefinition 存储到一个名为 beanDefinitionMap 的 Map 集合中去, Spring 框架再对该 Map 进行遍历,使用反射创建 Bean 实例对象,创建好的 Bean 对象存储在一个名为 singletonObjects 的 Map 集合中,当调用 getBean 方法时则最终从该 Map 集合中取出 Bean 实例对象返回。
BeanFactory默认的实现类是DefaultListableBeanFactory
DefaultListableBeanFactory对象内部维护着一个 beanDefinitionMap 用于存储封装好的 BeanDefinition,源码如下:
public class DefaultListableBeanFactory extends ... implements ...{
// 存储 < bean> 标签对应的 BeanDefinition 对象
// key:是Bean的 beanName,value:是Bean定义对象BeanDefinition
private final Map<String, BeanDefinition> beanDefinitionMap;
}
Spring框架会取出 beanDefinitionMap 中的每个 BeanDefinition 信息,反射构造方法或调用指定的工厂方法生成 Bean 实例对象,所以只要将 BeanDefinition 注册到 beanDefinitionMap 这个 Map 中, Spring 就会进行对应的 Bean 的实例化操作。
Bean实例及单例池 singletonObjects,beanDefinitionMap 中的 BeanDefinition 会被转化成对应的 Bean 实例对象,存储到单例池 singletonObjects 中去,在 DefaultListableBeanFactory 的上四级父类 DefaultSingletonBeanRegistry 中,维护着 singletonObjects ,源码如下:
public class DefaultSingletonBeanRegistry extends ... implements ...{
// 存储 Bean 实例的单例池
// key:是Bean的beanName,value:是Bean的实例对象
private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);
}
小结:
1.加载 xml 配置文件,解析获取配置中的每个 < bean>的信息,封装成一个个的 BeanDefinition 对象;
2.将 BeanDefinition 存储在一个名为 beanDefinitionMap 的 Map< String,BeanDefinition> 中;
3.ApplicationContext 底层遍历 beanDefinitionMap ,创建 Bean 实例对象;
4.创建好的 Bean 实例对象,被存储到一个名为 singletonObjects 的 Map< String,Object> 中;
5.当执行 applicationContext.getBean(beanName)时,从 singletonObjects 去匹配 Bean 实例返回。