spring技术内幕笔记:IoC容器的初始化过程(3)- BeanDefinition的注册
2017-07-15 09:01
726 查看
Spring版本:4.3.8.RELEASE
DefaultListableBeanFactory中,通过一个HashMap来持有和载入BeanDefinition,解析得到的BeanDefinition向IoC容器的beanDefinitionMap注册过程
是在载入BeanDefinition完成后进行的。
在DefaultListableBeanFactory中实现了BeanDefinitionRegistry接口,这个接口的实现完成BeanDefinition向容器的注册,这个过程就是把解析得到的BeanDefinition设置到hashMap中,进行BeanDefinition的注册。
DefaultListableBeanFactory中,通过一个HashMap来持有和载入BeanDefinition,解析得到的BeanDefinition向IoC容器的beanDefinitionMap注册过程
是在载入BeanDefinition完成后进行的。
在DefaultListableBeanFactory中实现了BeanDefinitionRegistry接口,这个接口的实现完成BeanDefinition向容器的注册,这个过程就是把解析得到的BeanDefinition设置到hashMap中,进行BeanDefinition的注册。
@SuppressWarnings("serial") public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable { /** bean definition对象的Map集合,key为bean的name*/ private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256); /** * 注册BeanDefinition的过程 */ @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; //检查是不是有相同名字的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_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 { 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); } } }
相关文章推荐
- spring技术内幕笔记:IoC容器初始化过程(2)- BeanDefinition的载入
- spring 技术内幕--IOC初始化之BeanDefinition的在IOC容器中的注册
- spring 技术内幕--IOC初始化过程深入之BeanDefinition的载入和解析1
- spring 技术内幕--IOC初始化过程深入之BeanDefinition的定位
- Spring源码阅读之IoC容器初始化3 -- BeanDefinition在IoC容器中的注册
- Spring技术内幕之IOC容器的实现(02)-BeanDefinition的Resource定位
- spring技术内幕笔记:IoC容器初始化过程(1)- Resource定位
- Spring源码阅读之IoC容器初始化2 -- BeanDefinition载入与解析
- 7-spring源码3.2.18解读+spring技术内幕(关于BeanDefinition的注册)
- Spring源码解析-BeanDefinition在IOC容器中的注册(三)
- Spring技术内幕之IOC容器的实现(01)-IOC容器初始化过程
- 【Spring Framework 深入】—— IoC容器初始化 -> BeanDefinition的注册
- 【Spring源码--IOC容器的实现】(四)BeanDefinition的注册
- (spring-第8回【IoC基础篇】)BeanDefinition在IoC容器中的注册
- Spring源码阅读--BeanDefinition 在 IOC 容器中的注册
- Ioc容器beanDefinition-Spring 源码系列(1)
- 【Spring源码--IOC容器的实现】(三)BeanDefinition的载入和解析【II】
- 6-spring源码3.2.18解读+spring技术内幕(关于BeanDefinition的载入和解析)
- Spring IOC容器分析(2) -- BeanDefinition
- BeanDefinition在IOC容器中的注册