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

相关推荐
wuxiguala几秒前
【服务器端表单字符验证】
java·开发语言
朱啸毅5 分钟前
如何使用Tomcat
java·tomcat
胖头鱼不吃鱼-19 分钟前
微服务拆分的原则、时机、方法以及常见问题
java·微服务·架构
LeonNo1123 分钟前
0411 | 软考高项笔记:项目立项
笔记
Ascend201524 分钟前
Clickhouse常用函数
java·clickhouse
红云梦31 分钟前
互联网三高-高性能之JVM调优
java·jvm·互联网三高架构
图梓灵33 分钟前
解析Java根基:Object类核心方法
java·开发语言·jvm
爱分享的淘金达人35 分钟前
25年河南事业单位报名详细流程图解
java·python·小程序·tomcat·流程图
猿java36 分钟前
一个HTTP请求,对方竟然知道我在哪个国家?
java·分布式·面试
User_芊芊君子39 分钟前
【Java实战】——手撕斐波那契数列
java·开发语言