返回介绍

3.1 bean 标签的解析及注册

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

在 4 种标签的解析中,对 bean 标签的解析最为复杂也最为重要,所以我们从此标签开始深入分析,如果能理解此标签的解析过程,其他标签的解析自然会迎刃而解。首先我们进入函数 processBeanDefinition(ele, delegate)。

protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {

  BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);

  if (bdHolder != null) {

   bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);

   try {

getRegistry());

   BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext(). }

   catch (BeanDefinitionStoreException ex) {

    getReaderContext().error("Failed to register bean definition with name '" +

    bdHolder.getBeanName() + "'", ele, ex);

  }

   getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));

 }

}

乍一看,似乎一头雾水,没有以前的函数那样清晰的逻辑。大致的逻辑总结如下。

(1)首先委托 BeanDefinitionDelegate 类的 parseBeanDefinitionElement 方法进行元素解析,返回 BeanDefinitionHolder 类型的实例 bdHolder,经过这个方法后,bdHolder 实例已经包含我们配置文件中配置的各种属性了,例如 class、name、id、alias 之类的属性。

(2)当返回的 bdHolder 不为空的情况下若存在默认标签的子节点下再有自定义属性,还需要再次对自定义标签进行解析。

(3)解析完成后,需要对解析后的 bdHolder 进行注册,同样,注册操作委托给了 Bean DefinitionReaderUtils 的 registerBeanDefinition 方法。

(4)最后发出响应事件,通知想关的监听器,这个 bean 已经加载完成了。

配合时序图(如图 3-1 所示),可能会更容易理解。

figure_0046_0028

图 3-1 bean 标签的解析及注册时序图

发布评论

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