【Spring Framework 深入】—— IoC容器初始化 -> BeanDefinition的注册
来源:互联网 发布:武装突袭3低配优化 编辑:程序博客网 时间:2024/05/29 09:15
IoC容器初始化的最后一步,想容器中注册完成解析得到的BeanDefinition。
方法调用流程图:
入口函数
DefaultBeanDefinitionDocumentReader.java
BeanDefinitionReaderUtils.javapublic static void registerBeanDefinition( BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) throws BeanDefinitionStoreException { // Register bean definition under primary name. String beanName = definitionHolder.getBeanName(); registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition()); // Register aliases for bean name, if any. String[] aliases = definitionHolder.getAliases(); if (aliases != null) { for (String alias : aliases) { registry.registerAlias(beanName, alias); } } }
可以看到委托给了registry.registerBeanDefinition(),BeanDefinitionRegistry 是一个接口,定义了注册BeanDefinition的行为。这里的registry实际上是容器本身DefaultListableBeanFactory。
DefaultListableBeanFactory.javaprivate final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256);//---------------------------------------------------------------------// Implementation of BeanDefinitionRegistry interface//--------------------------------------------------------------------- @Override public 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; 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_INFRASTRUCTURE if (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 { //Check whether this factory's bean creation phase already started, //i.e. whether any bean has been marked as created in the meantime. //检查factory's bean creation phase是否已经开始,若是,则需要同步 if (hasBeanCreationStarted()) { // Cannot modify startup-time collection elements anymore (for stable iteration) 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 { // Still in startup registration phase //注册过程 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 Framework 深入】—— IoC容器初始化 -> BeanDefinition的注册
- spring 技术内幕--IOC初始化之BeanDefinition的在IOC容器中的注册
- spring技术内幕笔记:IoC容器的初始化过程(3)- BeanDefinition的注册
- Spring源码阅读之IoC容器初始化3 -- BeanDefinition在IoC容器中的注册
- 【Spring Framework 深入】—— IoC容器初始化 -> Bean定义资源的Resource定位
- 【Spring Framework 深入】—— IoC容器初始化 -> Bean定义资源的载入解析
- Spring源码解析-BeanDefinition在IOC容器中的注册(三)
- Spring源码阅读--BeanDefinition 在 IOC 容器中的注册
- 【Spring源码--IOC容器的实现】(四)BeanDefinition的注册
- spring技术内幕笔记:IoC容器初始化过程(2)- BeanDefinition的载入
- 深入解读Spring Framework IoC容器(第八弹:Bean的初始化和销毁)
- spring 技术内幕--IOC初始化过程深入之BeanDefinition的定位
- spring 技术内幕--IOC初始化过程深入之BeanDefinition的载入和解析1
- BeanDefinition在IOC容器中的注册
- SpringIoC初始化BeanDefinition解析——注册
- Spring源码分析----IOC容器的实现(IoC容器的初始化过程(定位、载入解析、注册))
- Spring源码分析--Ioc容器定位解析资源文件并注册BeanDefinition
- Spring源码阅读之IoC容器初始化2 -- BeanDefinition载入与解析
- android webview 加载显示网页加载进度条的例子
- iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值
- 项目在eclipse运行正常,但单独部署到tomcat上不正常
- 88. Merge Sorted Array
- 存储性能优化
- 【Spring Framework 深入】—— IoC容器初始化 -> BeanDefinition的注册
- C++ string 用法详解
- ViewDragHelper解读
- gulp常用插件
- python如何支持中文注释
- 操作系统--存储管理
- HTML练习注册用户
- 同位语-名词性从句(基础)
- iOS 微信支付宝支付完成后跳转回自己的app