Spring源码解析之【BeanFactory】与【BeanDefinitionRegistry】

本文深入探讨Spring框架中的BeanFactory和BeanDefinitionRegistry接口及其重要实现类。BeanFactory作为Spring容器的基石,负责bean的创建与管理。BeanDefinitionRegistry则用于bean的注册。文中详细阐述了各个接口的功能,包括BeanDefinition接口及其子接口,以及其实现类如DefaultListableBeanFactory和XmlBeanDefinitionReader的角色。通过接口和类的交互,展示了Spring如何构建和管理bean的生命周期。
摘要由CSDN通过智能技术生成

Spring的一个非常重要的概念的就是Bean,Spring容器需要通过扫描和注册来实现对Bean信息的管理。在分析了Spring的源码之后发现,Spring里面用了很多的BeanFactory,这个类非常重要,因为实际上在Spring中BeanFactoryIOC容器的实际代表者,它用来创建和管理Bean。它为其他具体的IOC容器提供了最基本的规范,它是一个接口类型。

BeanFactory是最典型的工厂方法模式。不同类型的工厂会生产不同类型的商品。它的子接口和对应的实现类结构如下:

1. BeanFactory接口

在这里插入图片描述

我们可以看到在BeanFactory接口下面有三个子接口:

  • HierarchicalBeanFactory:提供父容器的访问功能
    • ConfigurableBeanFactory 接口
  • AutowireCapableBeanFactory:在BeanFactory基础上是实现了对已存在实例的管理
  • ListableBeanFactory:提供了批量获取Bean的方法

接口ConfigurableListableBeanFactory继承了上述的三个接口,增加了一些其他的功能:如类加载器、类型转换,属性编辑器,BeanPostProcessorBean定义等

实现类DefaultListableBeanFactory继承ConfigurableListableBeanFactory接口,实现了所有的BeanFactory功能,且可以注册BeanDefinition

1.1 ListableBeanFactory接口

上面的第一个图片没有截全,遗漏了ListableBeanFactory的部分实现类信息,且这个实现类还比较重要,因此再增加一个图片。

在这里插入图片描述
我们可以看到AnnotataionConfigApplicationContext实现了ListableBeanFactory接口。AnnotataionConfigApplicationContext类是注解驱动去扫描Bean的定义信息。这个类我们很熟悉,因为在Spring启动的时候就是利用这个类:

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig_AOP.class);

在使用BeanFactory工厂创建Bean的过程中,我们需要利用BeanDefinitionRegistry将这些Bean注册到DefaultListableBeanFactory中。那么接下来就介绍一下BeanDefinitionRegistry

2. BeanDefinitionRegistry接口

public interface BeanDefinitionRegistry extends AliasRegistry 

从上述代码可以看出,BeanDefinitionRegistry接口实现了AliasRegistry接口,它主要的工作就是定义Bean的常规操作。

它有三个子接口:

  • SimpleBeanDefinitionRegistry实现类
  • DefaultListableBeanFactory实现类
    • 基本实现类 ,拥有registryBeanDefinition功能
  • GenericApplicationContext实现类
    在这里插入图片描述
2.1 BeanDefinitionRegistry接口的功能
public interface BeanDefinitionRegistry extends AliasRegistry {
   

	// 向beanFactory中注册一个BeanDefinition
	void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			throws BeanDefinitionStoreException;

	// 根据beanName从beanFactory中移除一个已经注册的BeanDefinition
	void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	// 根据beanName从beanFactory中获取一个BeanDefinition
	BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	// 判断beanFactory中是否有beanName的BeanDefinition
	boolean containsBeanDefinition(String beanName);

	// 获取beanFactory中的所有BeanDefinition的beanName
	String[] getBeanDefinitionNames();

	// 获取beanFactory中的BeanDefinition的数量
	int getBeanDefinitionCount();

	// 判断beanFactory中的beanName是否被占用
	boolean isBeanNameInUse(String beanName);

}

2.2 SimpleBeanDefinitionRegistry

BeanDefinitionRegistry的一个简单实现方式,没有内置的beanFactory,这个类是用来留给我们测试用的。开发情况下Spring不会使用该类。
这个类的功能很简单,这里就不做详细介绍了,根据方法的名称就可以看出对应的方法所实现的功能。

public class SimpleBeanDefinitionRegistry extends SimpleAliasRegistry implements BeanDefinitionRegistry {
   

	// 使用ConcurrentHashMap来存储beanName和BeanDefinition
	private final Map<String, BeanDefini
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值