返回介绍

6.2 扩展功能

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

设置了路径之后,便可以根据路径做配置文件的解析以及各种功能的实现了。可以说 refresh 函数中包含了几乎 ApplicationContext 中提供的全部功能,而且此函数中逻辑非常清晰明了,使我们很容易分析对应的层次及逻辑。

public void refresh() throws BeansException, IllegalStateException {

  synchronized (this.startupShutdownMonitor) {

  //准备刷新的上下文环境

  prepareRefresh();

   // Tell the subclass to refresh the internal bean factory.

  //初始化 BeanFactory,并进行 XML 文件读取

   ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

   // Prepare the bean factory for use in this context.

  //对 BeanFactory 进行各种功能填充

  prepareBeanFactory(beanFactory);

   try {

    // Allows post-processing of the bean factory in context subclasses.

   // 子类覆盖方法做额外的处理

   postProcessBeanFactory(beanFactory);

   //激活各种 BeanFactory 处理器

   invokeBeanFactoryPostProcessors(beanFactory);

   // 注册拦截 Bean 创建的 Bean 处理器,这里只是注册,真正的调用是在 getBean 时候

   registerBeanPostProcessors(beanFactory);

   // 为上下文初始化 Message 源,即不同语言的消息体 ,国际化处理

   initMessageSource();

    // Initialize event multicaster for this context.

   // 初始化应用消息广播器,并放入“applicationEventMulticaster”bean 中

   initApplicationEventMulticaster();

    // Initialize other special beans in specific context subclasses.

    // 留给子类来初始化其它的 Bean

   onRefresh();

    // Check for listener beans and register them.

     //在所有注册的 bean 中查找 Listener bean,注册到消息广播器中

   registerListeners();

    // Instantiate all remaining (non-lazy-init) singletons.

   // 初始化剩下的单实例(非惰性的)

   finishBeanFactoryInitialization(beanFactory);

    // Last step: publish corresponding event.

   // 完成刷新过程,通知生命周期处理器 lifecycleProcessor 刷新过程,同时发出

   ContextRefreshEvent 通知别人

   finishRefresh();

  }

   catch (BeansException ex) {

    // Destroy already created singletons to avoid dangling resources.

   destroyBeans();

    // Reset 'active' flag.

   cancelRefresh(ex);

    // Propagate exception to caller.

    throw ex;

  }

 }

}

下面概括一下 ClassPathXmlApplicationContext 初始化的步骤,并从中解释一下它为我们提供的功能。

(1)初始化前的准备工作,例如对系统属性或者环境变量进行准备及验证。

在某种情况下项目的使用需要读取某些系统变量,而这个变量的设置很可能会影响着系统的正确性,那么 ClassPathXmlApplicationContext 为我们提供的这个准备函数就显得非常必要,它可以在 Spring 启动的时候提前对必须的变量进行存在性验证。

(2)初始化 BeanFactory,并进行 XML 文件读取。

之前有提到 ClassPathXmlApplicationContext 包含着 BeanFactory 所提供的一切特征,那么在这一步骤中将会复用 BeanFactory 中的配置文件读取解析及其他功能,这一步之后, ClassPathXmlApplicationContext 实际上就已经包含了 BeanFactory 所提供的功能,也就是可以进行 Bean 的提取等基础操作了。

(3)对 BeanFactory 进行各种功能填充。

@Qualifier 与 @Autowired 应该是大家非常熟悉的注解,那么这两个注解正是在这一步骤中增加的支持。

(4)子类覆盖方法做额外的处理。

Spring 之所以强大,为世人所推崇,除了它功能上为大家提供了便例外,还有一方面是它的完美架构,开放式的架构让使用它的程序员很容易根据业务需要扩展已经存在的功能。这种开放式的设计在 Spring 中随处可见,例如在本例中就提供了一个空的函数实现 postProcess BeanFactory 来方便程序员在业务上做进一步扩展。

(5)激活各种 BeanFactory 处理器。

(6)注册拦截 bean 创建的 bean 处理器,这里只是注册,真正的调用是在 getBean 时候。

(7)为上下文初始化 Message 源,即对不同语言的消息体进行国际化处理。

(8)初始化应用消息广播器,并放入“applicationEventMulticaster”bean 中。

(9)留给子类来初始化其他的 bean。

(10)在所有注册的 bean 中查找 listener bean,注册到消息广播器中。

(11)初始化剩下的单实例(非惰性的)。

(12)完成刷新过程,通知生命周期处理器 lifecycleProcessor 刷新过程,同时发出 Context RefreshEvent 通知别人。

发布评论

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