返回介绍

2.8.2 解析并注册 BeanDefinition

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

处理了 profile 后就可以进行 XML 的读取了,跟踪代码进入 parseBeanDefinitions(root, this.delegate)。

protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {

 //对 beans 的处理

  if (delegate.isDefaultNamespace(root)) {

   NodeList nl = root.getChildNodes();

   for (int i = 0; i < nl.getLength(); i++) {

    Node node = nl.item(i);

    if (node instanceof Element) {

     Element ele = (Element) node;

     if (delegate.isDefaultNamespace(ele)) {

     //对 bean 的处理

      parseDefaultElement(ele, delegate);

    }

     else {

     //对 bean 的处理

     delegate.parseCustomElement(ele);

    }

   }

  }

 }

  else {

  delegate.parseCustomElement(root);

 }

}

上面的代码看起来逻辑还是蛮清晰的,因为在 Spring 的 XML 配置里面有两大类 Bean 声明,一个是默认的,如:

<bean id="test" class="test.TestBean"/>

另一类就是自定义的,如:

<tx:annotation-driven/>

而两种方式的读取及解析差别是非常大的,如果采用 Spring 默认的配置,Spring 当然知道该怎么做,但是如果是自定义的,那么就需要用户实现一些接口及配置了。对于根节点或者子节点如果是默认命名空间的话则采用 parseDefaultElement 方法进行解析,否则使用 delegate.parseCustomElement 方法对自定义命名空间进行解析。而判断是否默认命名空间还是自定义命名空间的办法其实是使用 node.getNamespaceURI() 获取命名空间,并与 Spring 中固定的命名空间 http://www.Springframework.org/schema/beans 进行比对。如果一致则认为是默认,否则就认为是自定义。而对于默认标签解析与自定义标签解析我们将会在下一章中进行讨论。

发布评论

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