spring技术内幕笔记:IoC容器的初始化过程(3)- BeanDefinition的注册
来源:互联网 发布:javascript实战项目 编辑:程序博客网 时间:2024/05/29 11:45
Spring版本:4.3.8.RELEASE
DefaultListableBeanFactory中,通过一个HashMap来持有和载入BeanDefinition,解析得到的BeanDefinition向IoC容器的beanDefinitionMap注册过程
是在载入BeanDefinition完成后进行的。在DefaultListableBeanFactory中实现了BeanDefinitionRegistry接口,这个接口的实现完成BeanDefinition向容器的注册,这个过程就是把解析得到的BeanDefinition设置到hashMap中,进行BeanDefinition的注册。
@SuppressWarnings("serial")public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {/** bean definition对象的Map集合,key为bean的name*/private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256); /** * 注册BeanDefinition的过程 */@Overridepublic void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {Assert.hasText(beanName, "Bean name must not be empty");Assert.notNull(beanDefinition, "BeanDefinition must not be null");if (beanDefinition instanceof AbstractBeanDefinition) {try {((AbstractBeanDefinition) beanDefinition).validate();}catch (BeanDefinitionValidationException ex) {throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,"Validation of bean definition failed", ex);}}BeanDefinition oldBeanDefinition;//检查是不是有相同名字的BeanDefinition已经在IoC容器中注册了,如果有相同的BeanDefinition,但又不允许覆盖,会抛出异常oldBeanDefinition = this.beanDefinitionMap.get(beanName);if (oldBeanDefinition != null) {if (!isAllowBeanDefinitionOverriding()) {throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,"Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +"': There is already [" + oldBeanDefinition + "] bound.");}else if (oldBeanDefinition.getRole() < beanDefinition.getRole()) {// e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTUREif (this.logger.isWarnEnabled()) {this.logger.warn("Overriding user-defined bean definition for bean '" + beanName +"' with a framework-generated bean definition: replacing [" +oldBeanDefinition + "] with [" + beanDefinition + "]");}}else if (!beanDefinition.equals(oldBeanDefinition)) {if (this.logger.isInfoEnabled()) {this.logger.info("Overriding bean definition for bean '" + beanName +"' with a different definition: replacing [" + oldBeanDefinition +"] with [" + beanDefinition + "]");}}else {if (this.logger.isDebugEnabled()) {this.logger.debug("Overriding bean definition for bean '" + beanName +"' with an equivalent definition: replacing [" + oldBeanDefinition +"] with [" + beanDefinition + "]");}}this.beanDefinitionMap.put(beanName, beanDefinition);}else {if (hasBeanCreationStarted()) {// 使用synchronized保持数据的一致性synchronized (this.beanDefinitionMap) {this.beanDefinitionMap.put(beanName, beanDefinition);List<String> updatedDefinitions = new ArrayList<String>(this.beanDefinitionNames.size() + 1);updatedDefinitions.addAll(this.beanDefinitionNames);updatedDefinitions.add(beanName);this.beanDefinitionNames = updatedDefinitions;if (this.manualSingletonNames.contains(beanName)) {Set<String> updatedSingletons = new LinkedHashSet<String>(this.manualSingletonNames);updatedSingletons.remove(beanName);this.manualSingletonNames = updatedSingletons;}}}else {// 注册BeanDefinition,将解析后BeanDefinition放入map,key为bean name,value为BeanDefinition对象this.beanDefinitionMap.put(beanName, beanDefinition);this.beanDefinitionNames.add(beanName);this.manualSingletonNames.remove(beanName);}this.frozenBeanDefinitionNames = null;}if (oldBeanDefinition != null || containsSingleton(beanName)) {resetBeanDefinition(beanName);}}}
阅读全文
0 0
- spring技术内幕笔记:IoC容器的初始化过程(3)- BeanDefinition的注册
- spring技术内幕笔记:IoC容器初始化过程(2)- BeanDefinition的载入
- spring 技术内幕--IOC初始化之BeanDefinition的在IOC容器中的注册
- spring 技术内幕--IOC初始化过程深入之BeanDefinition的定位
- spring 技术内幕--IOC初始化过程深入之BeanDefinition的载入和解析1
- Spring技术内幕之IOC容器的实现(01)-IOC容器初始化过程
- 读《Spring技术内幕》-总结3-IoC容器的初始化过程
- Spring技术内幕之IOC容器的实现(02)-BeanDefinition的Resource定位
- 【Spring Framework 深入】—— IoC容器初始化 -> BeanDefinition的注册
- spring技术内幕笔记:IoC容器初始化过程(1)- Resource定位
- Spring源码阅读之IoC容器初始化3 -- BeanDefinition在IoC容器中的注册
- 【Spring源码--IOC容器的实现】(四)BeanDefinition的注册
- 7-spring源码3.2.18解读+spring技术内幕(关于BeanDefinition的注册)
- Spring技术内幕笔记 -- IoC容器的实现
- 《Spring技术内幕》笔记-第二章 IoC容器的实现
- spring技术内幕笔记:IoC容器的依赖注入
- Spring源码分析----IOC容器的实现(IoC容器的初始化过程(定位、载入解析、注册))
- 《Spring技术内幕》学习笔记4——IoC容器解析Bean定义资源并注册解析后的Bean
- 暑假正式开始啦!
- 超级台阶(菲波那切数列)
- 2.Linux Sever(Ubuntun16.04)的Caffe环境配置(CUDA8.0+CUDNN5.1)
- bootstrap移动端取消鼠标移入效果
- Python-读写文件
- spring技术内幕笔记:IoC容器的初始化过程(3)- BeanDefinition的注册
- 吹牛的资本之Hibernate框架,五分钟搞定Hibernate...
- python实现对指定字符串补足固定长度倍数截断输出
- ecjtu-summer training #5 B
- C++基础练习题之打怪
- Java_基础—HashSet存储字符串并遍历
- Ubuntu 16.04 禁用启用虚拟内存swap
- windows下Scrapy安装
- 一种较好的SQL Server与excel导出导入的方法技巧