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

从BeanDefinition到Bean实例

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

SimpleBeanDefinitionRegistry.java

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;
	}
}

DefaultListableBeanFactory.java

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);
	}
}

从类关系上来看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实现

其中BeanFactory是IOC容器的核心

相关推荐
小电玩4 分钟前
JAVA SE8
java·开发语言
liuwill4 分钟前
从技术打磨到产品验证:读《程序员修炼之道》的务实之道
笔记·程序人生
程序员大金19 分钟前
基于SSM+Vue+MySQL的酒店管理系统
前端·vue.js·后端·mysql·spring·tomcat·mybatis
努力的布布22 分钟前
Spring源码-从源码层面讲解声明式事务的运行流程
java·spring
程序员大金29 分钟前
基于SpringBoot的旅游管理系统
java·vue.js·spring boot·后端·mysql·spring·旅游
小丁爱养花30 分钟前
记忆化搜索专题——算法简介&力扣实战应用
java·开发语言·算法·leetcode·深度优先
大汉堡~36 分钟前
代理模式-动态代理
java·代理模式
爱上语文41 分钟前
Springboot三层架构
java·开发语言·spring boot·spring·架构
6230_1 小时前
git使用“保姆级”教程2——初始化及工作机制解释
开发语言·前端·笔记·git·html·学习方法·改行学it
Pandaconda1 小时前
【计算机网络 - 基础问题】每日 3 题(十)
开发语言·经验分享·笔记·后端·计算机网络·面试·职场和发展