您的位置:首页 > 移动开发

Spring如何通过application.xml解析出bean的配置信息

2013-12-09 16:50 726 查看
1)Spring注册Bean之前,一定要先解析bean,真正意义上的注册bean是在org.springframework.beans.factory.support.DefaultListableBeanFactory类中注册的,在这个类中有一个缓存,beanDefinitionMap用于缓存,解析出来的bean的定义,beanDefinitionNames用于缓存bean的名称。

/** Map of bean definition objects, keyed by bean name */

private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>();


/** List of bean definition names, in registration order */

private final List<String> beanDefinitionNames = new ArrayList<String>();


2)注册bean的方法,registerBeanDefinition

//---------------------------------------------------------------------

// Implementation of BeanDefinitionRegistry interface

//---------------------------------------------------------------------


public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)

throws BeanDefinitionStoreException {


//bean的名称为空,断言抛出异常

Assert.hasText(beanName, "Bean name must not be empty");

//beanDefinition为空抛出异常

Assert.notNull(beanDefinition, "BeanDefinition must not be null");

//[b]beanDefinition是[b]AbstractBeanDefinition类型,就要验证。[/b][/b]

if (beanDefinition instanceof AbstractBeanDefinition) {

try {

((AbstractBeanDefinition) beanDefinition).validate();

}

catch (BeanDefinitionValidationException ex) {

throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,

"Validation of bean definition failed", ex);

}

}


//使用synchronized同步beanDefinitionMap(缓存)

synchronized (this.beanDefinitionMap) {

//看新注册的beanname是否在缓存中已经存在,beanname是唯一的。

Object oldBeanDefinition = this.beanDefinitionMap.get(beanName);


//oldBeanDefinition为空,就将beanname注册到beanDefinitionNames缓存中,接下来就注册beandefinition到[b]beanDefinitionMap。但是如果[b]oldBeanDefinition不为null的话,接着就判断,如果不允许beandefinition的重写,就直接抛出异常,不能重写,如果允许重写,那就打印出日志,告诉我们beandefinition将被会重写。[/b][/b]

if (oldBeanDefinition != null) {

if (!this.allowBeanDefinitionOverriding) {

throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,

"Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +

"': There is already [" + oldBeanDefinition + "] bound.");

}

else {

if (this.logger.isInfoEnabled()) {

this.logger.info("Overriding bean definition for bean '" + beanName +

"': replacing [" + oldBeanDefinition + "] with [" + beanDefinition + "]");

}

}

}

else {

this.beanDefinitionNames.add(beanName);

this.frozenBeanDefinitionNames = null;

}

this.beanDefinitionMap.put(beanName, beanDefinition);


resetBeanDefinition(beanName);

}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: