Spring IOC学习(6)——DefaultListableBeanFactory

本文介绍了Spring中的DefaultListableBeanFactory,它作为成熟的BeanFactory,实现了BeanDefinitionRegistry接口,支持预注册bean定义。同时,文章讨论了项目启动后容器如何初始化单例对象,以及BeanFactory和ApplicationContext的关系,后者提供了事件机制等高级特性。
摘要由CSDN通过智能技术生成

目录

 

简介

项目启动后容器如何初始化所有单例对象

BeanFactory和ApplicationContext的关系


简介

DefaultListableBeanFactory已经是一个成熟的容器了,是Spring的默认BeanFactory;
实现了BeanDefinitionRegistry接口,可通过读取配置文件等方式,预先注册所有bean定义;
bean定义:描述bean的作用范围、ROLE等级、是否懒加载、depends-on等信息;这个概念在AbstractBeanFactory才出现,在FactoryBeanRegistrySupport之前都没有

/**
 * 注册bean定义
 */
 @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 existingDefinition = this.beanDefinitionMap.get(beanName);
  if (existingDefinition != null) {
   //已存在同名的bean定义
   if (!isAllowBeanDefinitionOverriding()) {
    //不允许覆盖则抛异常
    throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
      "Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +
      "': There is already [" + existingDefinition + "] bound.");
   }
   else if (existingDefinition.getRole() < beanDefinition.getRole()) {
    // e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTURE
    // 等级更高的bean定义将被覆盖
    if (logger.isWarnEnabled()) {
     logger.warn("Overriding user-defined bean definition for bean '" + beanName +
       "' with a framework-generated bean definition: replacing [" +
       existingDefinition + "] with [" + beanDefinition + "]");
    }
   }
   else if (!beanDefinition.equals(existingDefinition)) {
    //覆盖前打个日志
    if (logger.isInfoEnabled()) {
     logger.info("Overriding bean definition for bean '" + beanName +
       "' with a different definition: replacing [" + existingDefinition +
       "] with [" + beanDefinition + "]");
    }
   }
   else {
    if (logger.isDebugEnabled()) {
     logger.debug("Overriding bean definition for bean '" + beanName +
       "' with an equivalent definition: replacing [" + existingDefinition +
       "] with [" + beanDefinition + "]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值