r (int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
if (node instanceof Element) {
Element ele = (Element) node;
if (delegate.isDefaultNamespace(ele)) {
parseDefaultElement(ele, delegate);
}
else {
delegate.parseCustomElement(ele);
}
}
}
}
else {
delegate.parseCustomElement(root);
}
}
最终解析动作落地在两个方法处:parseDefaultElement(ele, delegate)
和 delegate.parseCustomElement(root)
。我们知道在 Spring 有两种 Bean 声明方式:
- 配置文件式声明:
<bean id="studentService" class="org.springframework.core.StudentService"/>
- 自定义注解方式:
<tx:annotation-driven>
两种方式的读取和解析都存在较大的差异,所以采用不同的解析方法,如果根节点或者子节点采用默认命名空间的话,则调用 parseDefaultElement()
进行解析,否则调用 delegate.parseCustomElement()
方法进行自定义解析。
至此,doLoadBeanDefinitions()
中做的三件事情已经全部分析完毕,下面将对 Bean 的解析过程做详细分析说明。