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容器的核心

相关推荐
霸道流氓气质3 小时前
Spring AI异常处理与重试机制
java·人工智能·spring
郑州光合科技余经理5 小时前
本地生活服务系统:成品模块和定制接口怎么划界
java·前端·人工智能·后端·系统架构·php·ai编程
萧瑟余晖6 小时前
Java深入解析篇三十三之密封类与接口(Sealed Classes)详解
java·开发语言
论迹复利9 小时前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
小江的记录本9 小时前
【CSS】CSS 动画:transition、animation、transform、CSS3 新特性(附《思维导图》)
前端·css·安全·spring·前端框架·css3·动画
张宇Joaquin10 小时前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
宸津-代码粉碎机10 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
2601_9637491011 小时前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构
xcLeigh11 小时前
Go入门:整数类型的溢出与安全边界
java·安全·golang
LuminousCPP12 小时前
数据结构-二叉树(六):BFS层序遍历与完全二叉树判断|复用链式队列 + (N_0=N_2+1) 性质证明
c语言·数据结构·笔记·算法·二叉树·宽度优先