• Spring源码笔记之SpringIOC--(2)从BeanDefinition到Bean实例


    从BeanDefinition到Bean实例

    对比SimpleBeanDefinitionRegistryDefaultListableBeanFactory的源码,中间省略一些无关紧要的逻辑:

    SimpleBeanDefinitionRegistry.java

    public class SimpleBeanDefinitionRegistry extends SimpleAliasRegistry implements BeanDefinitionRegistry {
    
    	/** Map of bean definition objects, keyed by bean name. */
    	private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(64);
        
        @Override
    	public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
    			throws BeanDefinitionStoreException {
    		this.beanDefinitionMap.put(beanName, beanDefinition);
        }
        
    	@Override
    	public BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
    		BeanDefinition bd = this.beanDefinitionMap.get(beanName);
    		if (bd == null) {
    			throw new NoSuchBeanDefinitionException(beanName);
    		}
    		return bd;
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    DefaultListableBeanFactory.java

    public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
    		implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
    	/** Map of bean definition objects, keyed by bean name. */
    	private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
        @Override
    	public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
    			throws BeanDefinitionStoreException {
            // 实现比较复杂暂时省略
        }
        
    	@Override
    	public BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
            // 实现比较复杂暂时省略
    	}
        
        @Override
        public Object getBean(String name) throws BeansException {
    		assertBeanFactoryActive();
    		return getBeanFactory().getBean(name);
    	}
        
        @Override
    	public <T> T getBean(Class<T> requiredType) throws BeansException {
    		return getBean(requiredType, (Object[]) null);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    从类关系上来看DefaultListableBeanFactory不单单实现了BeanDefinitionRegistry,还实现了BeanFactory(继承了AbstractAutowireCapableBeanFactory)提供了获取bean实例的方法。分析其继承关系如下:

    «interface»
    BeanDefinitionRegistry
    注册BeanDefinition接口
    «interface»
    BeanFactory
    ioc容器核心接口
    «interface»
    ListableBeanFactory
    BeanFactory扩展,提供获取所有Bean的能力
    «interface»
    AutowireCapableBeanFactory
    BeanFactory扩展,提供自动注入的能力
    «interface»
    HierarchicalBeanFactory
    BeanFactory扩展,提供访问父容器的功能
    «interface»
    ConfigurableBeanFactory
    提供配置BeanFactory的能力
    «interface»
    ConfigurableListableBeanFactory
    提供配置、分析和修改bean定义,以及预实例化单例能力
    DefaultListableBeanFactory
    Spring默认的BeanFactory实现

    其中BeanFactoryIOC容器的核心

  • 相关阅读:
    基于改进灰狼算法优化核极限学习机的锂电池动力电池荷电状态估计
    MySQL数据库之表的约束
    java字符串专项训练(手机号屏蔽)
    oracle常见错误
    Django 路由系统详解
    grpc 常用的几种通信模式
    JS引擎中的线程,事件循环,上下文
    .Net大数据平台Microsoft.Spark环境构建 附可运行源码。
    打破焦虑!AI 时代的程序员为什么需要云端 IDE?
    小黑昨晚又内耗了起床来个leetcode:109. 有序链表转换二叉搜索树
  • 原文地址:https://blog.csdn.net/Numb_ZL/article/details/136143455