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);
}
}
/** 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);
}
}
相关文章推荐
- 初步解析Spring是如何配置解析我们常用的ApplicationContext.xml的
- spring利用扫描方式对bean的处理(对任何版本如何获取xml配置信息的处理)
- spring利用扫描方式对bean的处理(对任何版本如何获取xml配置信息的处理)
- spring如何从jar中读取applicationContext.xml配置文件?
- Spring基础篇——通过Java注解和XML配置装配bean
- Spring配置文件(applicationContext.xml如何配置)
- Spring4.3.x 浅析xml配置的解析过程(4)——解析bean标签及其所有子标签
- Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析
- 在Spring的XML文件中通过命名空间配置的标签是怎么解析的?
- spring源码解析之默认配置文件名/WEB-INF/applicationContext.xml
- 通过ApplicationContextAwareSpring实现手工加载配置的javabean
- Spring 如何在xml中配置Bean?
- 模拟Spring中applicationContext.xml配置文件初始化bean的过程
- Spring基础篇——通过Java注解和XML配置装配bean
- Spring是如何解析xml配置的
- 从applicationContext.xml到beanfactiory 谈Spring从配置文件中获取bean
- Spring学习笔记---2.1-IOC容器解析Bean配置信息
- spring源码解析之默认配置文件名/WEB-INF/applicationContext.xml
- 通过ApplicationContextAwareSpring实现手工加载配置的javabean
- SpringMVC 通过XML方式进行配置解析BeanNameUrlHandlerMapping