返回介绍

6.4 加载 BeanFactory

发布于 2025-04-22 22:09:12 字数 2315 浏览 0 评论 0 收藏

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 是函数内的局部变量,所以要使用全局变量记录解析结果。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。