基于Xml 的IOC 容器-向容器注册
生活随笔
收集整理的這篇文章主要介紹了
基于Xml 的IOC 容器-向容器注册
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
DefaultListableBeanFactory 中使用一個HashMap 的集合對象存放IOC 容器中注冊解析的BeanDefinition,向IOC 容器注冊的主要源碼如下:
//存儲注冊信息的BeanDefinition private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256); //向IOC容器注冊解析的BeanDefiniton@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");//校驗解析的BeanDefinitonif (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_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()) {// Cannot modify startup-time collection elements anymore (for stable iteration)//注冊的過程中需要線程同步,以保證數據的一致性synchronized (this.beanDefinitionMap) {this.beanDefinitionMap.put(beanName, beanDefinition);List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);updatedDefinitions.addAll(this.beanDefinitionNames);updatedDefinitions.add(beanName);this.beanDefinitionNames = updatedDefinitions;if (this.manualSingletonNames.contains(beanName)) {Set<String> updatedSingletons = new LinkedHashSet<>(this.manualSingletonNames);updatedSingletons.remove(beanName);this.manualSingletonNames = updatedSingletons;}}}else {// Still in startup registration phasethis.beanDefinitionMap.put(beanName, beanDefinition);this.beanDefinitionNames.add(beanName);this.manualSingletonNames.remove(beanName);}this.frozenBeanDefinitionNames = null;}//檢查是否有同名的BeanDefinition已經在IOC容器中注冊if (oldBeanDefinition != null || containsSingleton(beanName)) {//重置所有已經注冊過的BeanDefinition的緩存resetBeanDefinition(beanName);}}至此,Bean 配置信息中配置的Bean 被解析過后,已經注冊到IOC 容器中,被容器管理起來,真正完成了IOC 容器初始化所做的全部工作。現在IOC 容器中已經建立了整個Bean 的配置信息,這些BeanDefinition 信息已經可以使用,并且可以被檢索,IOC 容器的作用就是對這些注冊的Bean 定義信息進行處理和維護。這些的注冊的Bean 定義信息是IOC 容器控制反轉的基礎,正是有了這些注冊的數據,容器才可以進行依賴注入。
?
總結
以上是生活随笔為你收集整理的基于Xml 的IOC 容器-向容器注册的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Xml 的IOC 容器-分配注册策略
- 下一篇: Annotation 的前世今生