在上一节第一个函数里,有两个比较重要的函数调用,第一个在上一节已经分析过了,这个函数将我们定义在xml文件里的bean的信息,封装到一个 BeanDefinitionHolder类型的对象里。这一节将继续处理这个对象。
2.1.1.1.2 registerBeanDefinition (bdHolder, getReaderContext().getRegistry())
在 BeanDefinitionReaderUtils 调用:
====================================================================
public static void registerBeanDefinition (
BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) throws BeanDefinitionStoreException {
// 这里得到需要注册 bean 的名字;
String beanName = definitionHolder.getBeanName();
registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition() );
// 别名也是可以通过 IOC 容器和 bean 联系起来的进行注册
String[] aliases = definitionHolder.getAliases();
if (aliases != null ) {
for ( int i = 0; i < aliases. length ; i++) {
registry.registerAlias(beanName, aliases[i]);
}
}
}
====================================================================
最后一个函数了
2.1.1.1.2.1 registerBeanDefinition(beanName,definitionHolder.getBeanDefinition()) ;
定义在 DefaultListableBeanFactory 类中。
====================================================================
// Implementation of BeanDefinitionRegistry interface
// 这里是 IOC 容器对 BeanDefinitionRegistry 接口的实现
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 ) {
// 先看看在容器里是不是已经有了同名的 bean, 如果有抛出异常。
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 {
// 把 bean 的名字加到 IOC 容器中去
this . beanDefinitionNames .add(beanName) ;
this . frozenBeanDefinitionNames = null ;
}
// 这里把 bean 的名字和 Bean 定义联系起来放到一个 HashMap 中去 ,IOC 容器通过这个 Map 来维护容器里的 Bean 定义信息。
this . beanDefinitionMap .put(beanName, beanDefinition) ;
resetBeanDefinition(beanName);
}
}
====================================================================
这样就完成了 Bean 定义在 IOC 容器中的注册,就可被 IOC 容器进行管理和使用了。
本站支持 pay for your wishes
相关推荐
3、源码分析-IOC容器的初始化 4、源码分析-IOC容器的依赖注入 5、源码分析-IOC容器的高级特性 三阶段 Spring AOP的涉及原理及具体实践 SpringJDBC的涉及原理及二次开发 SpringMVC框架设计原理及手写实现 四阶段 ...
本文深入探讨了Spring框架中IoC容器的源码机制,涵盖了容器的初始化、Bean工厂的实例化、Bean定义的读取及Spring Bean的生命周期管理。通过精细的分析,本文揭示了AnnotationConfigApplicationContext的实例化过程,...
为Spring提供了基础的Web功能支持,主要建立于核心容器之上,通过Servlet或者Listeners来初始化IOC容器; spring-webmvc: 主要提供对SpringMVC的支持,例如SpringMVC中的DispatcherServlet就是该模块中提供的; ...
本文深入探讨了Spring IoC容器的加载过程及其源码实现,揭示了Spring中最为根本的概念之一。这包括从AnnotationConfigApplicationContext的实例化开始,到DefaultListableBeanFactory工厂的建立,再到...
1、通过分析 Spring 源码,深刻掌握核心原理和设计思想 2、通过本课的学习,完全掌握 SpringIOC 容器的初始化细节,并手绘时序图 3、掌握看源码不
简单的说,在web容器中,通过ServletContext为Spring的IOC容器提供宿主环境,对应的建立起一个IOC容器的体系。其中,首先需要建立的是根上下文,这个上下文持有的对象可以有业务对象,数据存取对象,资源,事物管理...
整个视频课程将由浅入深,介绍spring5源码的构建、spring5IOC容器的初始化过程、bean的声明周期过程、spring BeanFactoryPostporcessor并且结合原理给出当前流行的应用框架如何利用spring的源码知识写出优雅的代码,...
包括内容:Spring体系结构、Spring重要接口讲解(BeanFactory继承体系、BeanDefinition继承体系、ApplicationContext继承体系)、IOC/DI(容器初始化流源码分析)、AOP原理(解析流程,代理流程,执行流程)、事务...
java进阶源码分析专题常用设计模式线程与并发锁的使用深度理解synchronized、volatile、cas手写ASQSpring5IOC容器设计原理及高级特性AOP设计原理FactoryBean与BeanFactorySpring事务处理机制Spring JDK动态代理...
8.4.3 改变初始化和销毁方式 8.4.4 改变异常处理的方式 8.5 小结 第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 ...
8.4.3 改变初始化和销毁方式 8.4.4 改变异常处理的方式 8.5 小结 第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 ...
8.4.3 改变初始化和销毁方式 8.4.4 改变异常处理的方式 8.5 小结 第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 ...
8.4.3 改变初始化和销毁方式 8.4.4 改变异常处理的方式 8.5 小结 第九章 CVS使用指南 9.1 CVS介绍 9.1.1 CVS简介 9.1.2 为什么要使用CVS 9.2 建立CVS的开发环境 9.2.1 下载CVS 9.2.2 配置CVS 9.3 CVS的使用方法 ...