- 前言
- 第一部分 核心实现
- 第 1 章 Spring 整体架构和环境搭建
- 第 2 章 容器的基本实现
- 第 3 章 默认标签的解析
- 第 4 章 自定义标签的解析
- 第 5 章 bean 的加载
- 第 6 章 容器的功能扩展
- 第 7 章 AOP
- 第二部分 企业应用
- 第 8 章 数据库连接 JDBC
- 第 9 章 整合 MyBatis
- 第 10 章 事务
- 第 11 章 SpringMVC
- 第 12 章 远程服务
- 第 13 章 Spring 消息
6.4 加载 BeanFactory
obtainFreshBeanFactory 方法从字面理解是获取 BeanFactory。之前有说过, Application Context 是对 BeanFactory 的功能上的扩展,不但包含了 BeanFactory 的全部功能更在其基础上添加了大量的扩展应用,那么 obtainFreshBeanFactory 正是实现 BeanFactory 的地方,也就是经过了这个函数后 ApplicationContext 就已经拥有了 BeanFactory 的全部功能。
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
//初始化 BeanFactory,并进行 XML 文件读取,并将得到的 BeanFacotry 记录在当前实体的属性中
refreshBeanFactory();
//返回当前实体的 beanFactory 属性
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (logger.isDebugEnabled()) {
logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
}
return beanFactory;
}
方法中将核心实现委托给了 refreshBeanFactory:
@Override
protected final void refreshBeanFactory() throws BeansException {
if (hasBeanFactory()) {
destroyBeans();
closeBeanFactory();
}
try {
//创建 DefaultListableBeanFactory
DefaultListableBeanFactory beanFactory = createBeanFactory();
//为了序列化指定 id,如果需要的话,让这个 BeanFactory 从 id 反序列化到 BeanFactory 对象
beanFactory.setSerializationId(getId());
//定制 beanFactory,设置相关属性,包括是否允许覆盖同名称的不同定义的对象以及循环依赖以及
//设置 @Autowired 和 @Qualifier 注解解析器 QualifierAnnotationAutowire
CandidateResolver
customizeBeanFactory(beanFactory);
//初始化 DodumentReader,并进行 XML 文件读取及解析
loadBeanDefinitions(beanFactory);
synchronized (this.beanFactoryMonitor) {
this.beanFactory = beanFactory;
}
}
catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition
source for " + getDisplayName(), ex);
}
}
我们详细分析上面的每个步骤。
(1)创建 DefaultListableBeanFactory。
在介绍 BeanFactory 的时候,不知道读者是否还有印象,声明方式为:BeanFactory bf = new XmlBeanFactory("beanFactoryTest.xml"),其中的 XmlBeanFactory 继承自 DefaultListableBean Factory,并提供了 XmlBeanDefinitionReader 类型的 reader 属性,也就是说 DefaultListableBean Factory 是容器的基础。必须首先要实例化,那么在这里就是实例化 DefaultListableBeanFactory 的步骤。
(2)指定序列化 ID。
(3)定制 BeanFactory。
(4)加载 BeanDefinition。
(5)使用全局变量记录 BeanFactory 类实例。
因为 DefaultListableBeanFactory 类型的变量 beanFactory 是函数内的局部变量,所以要使用全局变量记录解析结果。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论