spring 源码分析--IOC容器初始化七
在上一节第一个函数里,有两个比较重要的函数调用,第一个在上一节已经分析过了,这个函数将我们定义在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
上一篇: SQLite源码剖析(1)
下一篇: qq' onmousemove=alert(1) style='width:2000px;height:2000px;display:block'alt
推荐阅读
-
详解Spring IOC 容器启动流程分析
-
SpringBoot 源码解析 (六)----- Spring Boot的核心能力 - 内置Servlet容器源码分析(Tomcat)
-
spring源码分析系列5:ApplicationContext的初始化与Bean生命周期
-
spring源码分析6: ApplicationContext的初始化与BeanDefinition的搜集入库
-
Spring源码剖析2:Spring IOC容器的加载过程
-
Spring源码分析之IoC容器初始化
-
详解Spring IOC 容器启动流程分析
-
Spring源码学习(一):Spring容器创建和初始化工作准备
-
Spring源码分析-IOC容器BeanFactory的应用场景
-
Guzz源码分析(一) guzz容器初始化过程