r接口的实现,这个接口的具体类是 DefaultXmlBeanDefinitionParser,这个接口很简单,只有registerBeanDefinitions一 个方法,这个方法的作用也很明了,就是用来注册Bean的定义的,所以说类和方法的名字 一定要起得有意义,这样可以让人一看就大概了解其作用,减少了很多阅读代码的痛苦。 废话不多说,我们打开DefaultXmlBeanDefinitionParser的registerBeanDefinitions方 法,这个类就是解释XML配置文件的核心类了,打开registerBeanDefinitions方法后我们 看到如下代码:
Java代码
public int registerBeanDefinitions(BeanDefinitionReader reader, Document doc, Resource resource)
throws BeanDefinitionStoreException {
this.beanDefinitionReader = reader;
this.resource = resource;
logger.debug("Loading bean definitions");
Element root = doc.getDocumentElement();
//初始化根元素
initDefaults(root);
if (logger.isDebugEnabled()) {
logger.debug("Default lazy init ''" + getDefaultLazyInit() + "''");
logger.debug("Default autowire ''" + getDefaultAutowire() + "''");
logger.debug("Default dependency check ''" + getDefaultDependencyCheck() + "''");
}
preProcessXml(root);//一个空方法用于扩展
int beanDefinitionCount = parseBeanDefinitions(root);//解释配置的主 要方法
if (logger.isDebugEnabled()) {
logger.debug("Found " + beanDefinitionCount + " <bean> elements in " + resource);
}
postProcessXml(root); //一个空方法用于扩展
return beanDefinitionCount;
}
在这个方法当中,主要用于解释定义的有两个方法,一个是initDefaults,一个是 parseBeanDefinitions,第一个方法是用来解释根元素的属性的,例如lazy-init, autowire等,而parseBeanDefinitions就是用来解释具体的bean定义了,方法代码如下:
Java代码
protected int parseBeanDefinitions(Element root) throws BeanDefinitionStoreException {
NodeList nl = root.getChildNodes();
int beanDefinitionCount = 0;
for (int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
if (node instanceof Element) {
Element ele = (Element) node;
if (IMPORT_ELEMENT.equals(node.getNodeName())) {
importBeanDefinitionResource(ele);
}
else if (ALIAS_ELEMENT.equals(node.getNodeName())) {
String name = ele.getAttribute(NAME_ATTRIBUTE);
String alias = ele.getAttribute(ALIAS_ATTRIBUTE);
this.beanDefinitionReader.getBeanFactory ().registerAlias(name, alias);
}
else if (BEAN_ELEMENT.equals(node.getNodeName())) {
beanDefinitionCount++;
BeanDefinitionHolder bdHolder = parseBeanDefinitionElement(ele, false);
BeanDefinitionReaderUtils.registerBeanDefinition (bdHolder, this.beanDefinitionReader.getBeanFactory());
|