Spring源码解析-BeanDefinition在IOC容器中的注册(三)
来源:互联网 发布:素媛用什么软件看 编辑:程序博客网 时间:2024/06/05 23:02
在上一部分,我们看到了在对BeanDefinition解析完成之后,会向注册表中注册BeanDefinition,源码如下:
processBeanDefinition(DefaultBeanDefinitionDocumentReader)
protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);if (bdHolder != null) {bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);try {// Register the final decorated instance.BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());}catch (BeanDefinitionStoreException ex) {getReaderContext().error("Failed to register bean definition with name '" +bdHolder.getBeanName() + "'", ele, ex);}// Send registration event.getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));}}
真正的注册发生在BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry()); 中,这里注册器其实就是之前一直提到的底层工厂DefaultListableBeanFactory(实现了BeanDefinitionRegistry).
下面我们来看一下registerBeanDefinition的源码(BeanDefinitionReaderUtils)
/** * Register the given bean definition with the given bean factory. * @param definitionHolder the bean definition including name and aliases * @param registry the bean factory to register with * @throws BeanDefinitionStoreException if registration failed */public 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 (int i = 0; i < aliases.length; i++) {registry.registerAlias(beanName, aliases[i]);}}}
我们可以看到真正的注册发生在registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());这一步。继续往里跟,我们来看一下DefaultListableBeanFactory是怎么实现的
//---------------------------------------------------------------------// Implementation of BeanDefinitionRegistry interface//---------------------------------------------------------------------public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {Assert.hasText(beanName, "'beanName' 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);}}synchronized (this.beanDefinitionMap) {Object oldBeanDefinition = this.beanDefinitionMap.get(beanName);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);}}
我们看到其实底层存储这个BeanDefinition的数据结构就是一个简单的Map
( /** Map of bean definition objects, keyed by bean name */
private final Map beanDefinitionMap = CollectionFactory.createConcurrentMapIfPossible(16);)
- Spring源码解析-BeanDefinition在IOC容器中的注册(三)
- Spring源码阅读--BeanDefinition 在 IOC 容器中的注册
- Spring源码阅读之IoC容器初始化3 -- BeanDefinition在IoC容器中的注册
- BeanDefinition在IOC容器中的注册
- spring 技术内幕--IOC初始化之BeanDefinition的在IOC容器中的注册
- Spring源码分析--Ioc容器定位解析资源文件并注册BeanDefinition
- 【Spring源码--IOC容器的实现】(三)BeanDefinition的载入和解析【I】
- 【Spring源码--IOC容器的实现】(三)BeanDefinition的载入和解析【II】
- 【Spring源码--IOC容器的实现】(四)BeanDefinition的注册
- IOC容器构造之注册BeanDefinition源码分析
- Spring源码阅读之IoC容器初始化2 -- BeanDefinition载入与解析
- spring源码学习(三)解析和注册BeanDefinition(上)
- 【Spring源码解析】之IOC容器在Web容器中的启动
- Spring源码分析----IOC容器的实现(IoC容器的初始化过程(定位、载入解析、注册))
- spring源码(8)注册解析的BeanDefinition
- 【Spring Framework 深入】—— IoC容器初始化 -> BeanDefinition的注册
- spring技术内幕笔记:IoC容器的初始化过程(3)- BeanDefinition的注册
- Spring IoC容器在Web环境中的启动源码阅读
- js Function.call
- ControlTemplate in WPF —— ListBox
- eclipse 下导入android项目中文乱码
- 中文截取,支持gb2312,gbk,utf-8,big5
- 关于const修饰符(内容不断扩充中)
- Spring源码解析-BeanDefinition在IOC容器中的注册(三)
- ControlTemplate in WPF —— ItemsControl
- PHP iconv()函数转字符编码的问题
- 笔试题之Linux
- C#操作文件大全
- Android:源码环境下移植第三方的apk内置到ROM(System Image)中
- ControlTemplate in WPF —— TreeView
- 开源项目之饭否 for Android
- ControlTemplate in WPF —— TabControl