第三章:BeanDefinitionRegistry接口说明

本文详细介绍了Spring中BeanDefinitionRegistry接口的功能,包括注册、删除、查询Bean定义的方法,并展示了如何在代码中实现Bean定义的注册和获取。此外,还提及了别名注册的相关接口AliasRegistry。通过示例代码,演示了如何在DefaultListableBeanFactory中操作Bean定义,为理解Spring的内部工作原理提供了帮助。

BeanDefinitionRegistry:是用于对Bean定义的增、删、查操作。

一:BeanDefinitionRegistry接口说明

public interface BeanDefinitionRegistry extends AliasRegistry {

	/**
	 * 注册bean定义
	 */
	void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			throws BeanDefinitionStoreException;

	/**
	 * 根据名称删除bean定义
	 */
	void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	/**
	 * 根据名称获取bean定义
	 */
	BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	/**
	 * 判断是否包含指定名称的Bean定义
	 */
	boolean containsBeanDefinition(String beanName);

	/**
	 * 获取所有已经注册的bean定义名称
	 */
	String[] getBeanDefinitionNames();

	/**
	 * 获取注册过的bean定义数量
	 */
	int getBeanDefinitionCount();

	/**
	*根据名称判断bean定义是否正在使用
	 */
	boolean isBeanNameInUse(String beanName);

}

二:bean定义别名注册

public interface AliasRegistry {

	/**
	 * 注册别名
	 */
	void registerAlias(String name, String alias);

	/**
	 * 删除别名
	 */
	void removeAlias(String alias);

	/**
	 * 判断name是否是bean定义的别名
	 */
	boolean isAlias(String name);

	/**
	 * 获取name的所有别名
	 */
	String[] getAliases(String name);
}

三:代码说明(建议自己写一遍,后期阅读源码)

package interfaceTest;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.support.*;
import org.springframework.context.annotation.ConfigurationClassPostProcessor;

public class BeanDefinitionRegistryTest {

	/**
       本次用例只写注册和获取,其他的大家自己写。
	*/
	public static void main(String[] args) {
		/**
		 *DefaultListableBeanFactory 是BeanFactory的子类,同时也实现了BeanDefinitionRegistry接口
		 */
		DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();

		/**
		 * 注册Bean定义
		 */
		registerBeanDefinition(beanFactory);

		/**
		 *根据名称获取bean定义
		 */
		BeanDefinition userBeanDefinition = getBeanDefinition("user", beanFactory);


		User user = beanFactory.getBean("user", User.class);

		System.out.println(user);
	}

	/**
	 * 注册Bean定义
	 */
	public static void registerBeanDefinition(BeanDefinitionRegistry registry){
		RootBeanDefinition def = new RootBeanDefinition(User.class);
		def.setScope(ConfigurableBeanFactory.SCOPE_SINGLETON);
		//创建bean定义
		registry.registerBeanDefinition("user",def);
	}
	
	/**
	 * 根据名称获取bean定义
	 */
	public static  BeanDefinition getBeanDefinition(String beanName,BeanDefinitionRegistry registry) {
		BeanDefinition beanDefinition = registry.getBeanDefinition(beanName);
		return beanDefinition;
	}

	/**
	 * 根据名称删除bean定义
	 */
	void removeBeanDefinition(String beanName) {

	}

	/**
	 * 判断是否包含指定名称的Bean定义
	 */
	boolean containsBeanDefinition(String beanName){
		return true;
	}

	/**
	 * 获取所有已经注册的bean定义名称
	 */
	String[] getBeanDefinitionNames(){
		return null;
	}

	/**
	 * 获取注册过的bean定义数量
	 */
	int getBeanDefinitionCount(){
		return 0;
	}

	/**
	 *根据名称判断bean定义是否正在使用
	 */
	boolean isBeanNameInUse(String beanName){
		return true;
	}

}
<think>我们正在讨论SpringBoot中BeanDefinitionRegistry接口的默认实现类。根据引用内容,我们知道BeanDefinitionRegistry是用于管理BeanDefinition的注册表接口。在SpringBoot中,它的默认实现类是什么?根据Spring框架的设计,BeanDefinitionRegistry接口的主要实现类是DefaultListableBeanFactory。这个类同时实现了BeanDefinitionRegistry和ConfigurableListableBeanFactory接口,提供了完整的BeanDefinition注册和管理功能。在SpringBoot的启动过程中,SpringApplication会创建一个ApplicationContext(通常是AnnotationConfigApplicationContext或AnnotationConfigServletWebServerApplicationContext等),而ApplicationContext内部会包含一个DefaultListableBeanFactory实例作为其BeanFactory,同时也是BeanDefinitionRegistry的实现。因此,我们可以得出结论:在SpringBoot中,BeanDefinitionRegistry的默认实现类是DefaultListableBeanFactory。为了验证这一点,我们可以查看SpringBoot启动过程中创建ApplicationContext的代码。在SpringApplication的run方法中,会调用createApplicationContext方法来创建ApplicationContext实例。对于非Web环境,它创建的是AnnotationConfigApplicationContext;对于Web环境,它创建的是AnnotationConfigServletWebServerApplicationContext(或其它相应的WebApplicationContext)。而这些ApplicationContext内部都使用了DefaultListableBeanFactory作为BeanFactory。我们也可以从引用[3]中看到,ConfigurableListableBeanFactory被提及,而DefaultListableBeanFactory正是它的一个实现。因此,回答如下:在SpringBoot中,`BeanDefinitionRegistry`接口的默认实现类是`DefaultListableBeanFactory`。这个类位于`org.springframework.beans.factory.support`包中,它同时实现了`BeanDefinitionRegistry`和`ConfigurableListableBeanFactory`接口,提供了BeanDefinition的注册、管理以及Bean工厂的功能。在SpringBoot启动时,通过`SpringApplication.run()`方法创建的应用上下文(如`AnnotationConfigApplicationContext`)内部会使用`DefaultListableBeanFactory`作为其BeanDefinitionRegistry和BeanFactory。我们可以通过以下方式获取这个实例:```java@SpringBootApplicationpublicclassMain{publicstaticvoidmain(String[]args){ConfigurableApplicationContextcontext=SpringApplication.run(Main.class,args);//获取内部的DefaultListableBeanFactoryDefaultListableBeanFactorybeanFactory=(DefaultListableBeanFactory)context.getBeanFactory();}}```注意:在应用启动后,我们可以通过应用上下文获取其内部的BeanFactory,并将其转换为DefaultListableBeanFactory。引用说明:[^3]:提到了BeanDefinitionRegistry和ConfigurableListableBeanFactory,这有助于我们理解DefaultListableBeanFactory作为实现类的重要性。§§相关问题§§1.SpringBoot中BeanDefinitionRegistry的作用是什么?2.除了DefaultListableBeanFactory,还有哪些类实现了BeanDefinitionRegistry接口?3.如何在SpringBoot启动过程中自定义BeanDefinitionRegistry?</think>在 Spring Boot 中,`BeanDefinitionRegistry` 接口的默认实现类是 `DefaultListableBeanFactory`。这个类位于 `org.springframework.beans.factory.support` 包中,是 Spring 容器中最核心的 Bean 工厂实现,同时也是 `BeanDefinitionRegistry` 的主要实现类。 ### 关键特性: 1. **核心注册表功能** `DefaultListableBeanFactory` 实现了 `BeanDefinitionRegistry` 接口的全部方法,包括: - `registerBeanDefinition()`:注册 Bean 定义 - `removeBeanDefinition()`:移除 Bean 定义 - `getBeanDefinition()`:获取 Bean 定义 - 其他管理 Bean 定义的方法 [^3] 2. **在 Spring Boot 启动中的作用** - 当执行 `SpringApplication.run()` 时,Spring Boot 会创建 `AnnotationConfigApplicationContext`(或 Web 环境下的变体) - 这些 `ApplicationContext` 内部**持有一个 `DefaultListableBeanFactory` 实例**作为实际的 Bean 定义注册表 - 所有通过 `@ComponentScan` 发现的组件、`@Bean` 方法定义的 Bean 以及自动配置类都会被注册到此工厂中 [^2] 3. **数据结构** 内部通过三个核心属性管理 Bean 定义: ```java // Bean 定义映射表 (beanName -> BeanDefinition) private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(); // 所有已注册的 Bean 名称列表 private volatile List<String> beanDefinitionNames = new ArrayList<>(); // 手动注册的单例名称集合 private final Set<String> manualSingletonNames = new LinkedHashSet<>(); ``` 注册新 Bean 时会同步更新这些数据结构 [^4] ### 验证示例 可以通过调试查看实际类型: ```java @SpringBootApplication public class DemoApplication { public static void main(String[] args) { ConfigurableApplicationContext ctx = SpringApplication.run(DemoApplication.class, args); // 获取内部的 BeanFactory ConfigurableListableBeanFactory beanFactory = ctx.getBeanFactory(); System.out.println("实现类: " + beanFactory.getClass().getName()); // 输出: org.springframework.beans.factory.support.DefaultListableBeanFactory } } ``` ### 其他实现说明 虽然 `DefaultListableBeanFactory` 是默认实现,但在特殊场景中可能使用其他实现: - `GenericApplicationContext`:直接持有 `DefaultListableBeanFactory` 的简化上下文 - `StaticApplicationContext`:用于编程式配置的静态上下文 - 自定义实现:可通过扩展 `DefaultListableBeanFactory` 覆盖注册逻辑(需在 `SpringApplication` 初始化前设置) [^3]: BeanDefinitionRegistry 是管理 BeanDefinition 的核心接口,提供注册、移除、查询等功能 [^2]: @SpringBootApplication 注解组合了 @EnableAutoConfiguration,触发自动配置类的 BeanDefinition 注册 [^4]: DefaultListableBeanFactory 在注册新 BeanDefinition 时需要同步更新三个核心数据结构
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值