spring基础-核心类DefaultListableBeanFactory(二):BeanDefinitionRegistry接口

Spring Bean加载核心:DefaultListableBeanFactory
本文深入解析Spring框架中DefaultListableBeanFactory类的作用与实现,它是Spring加载与注册Bean的核心组件,继承自AbstractAutowireCapableBeanFactory并实现ConfigurableListableBeanFactory和BeanDefinitionRegistry接口,掌握其工作原理对于理解Spring的Bean管理至关重要。

spring基础 核心类DefaultListableBeanFactory(二):BeanDefinitionRegistry接口

DefaultListableBeanFactory是整个bean加载的核心部分,是spring注册及加载bean的默认实现。

DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory类,实现了ConfigurableListableBeanFactory和BeanDefinitionRegistry接口。

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
		implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
}		

DefaultListableBeanFactory类的层次结构图:
DefaultListableBeanFactory类的层次结构图

在这里插入图片描述

由上面的层次结构图发现:
DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory类,实现了ConfigurableListableBeanFactory和BeanDefinitionRegistry接口。

一.BeanDefinitionRegistry接口

BeanDefinitionRegistry接口定义了关于beanDefinition注册、注销、查询等一系列的操作。

查看BeanDefinitionRegistry接口:

public interface BeanDefinitionRegistry extends AliasRegistry {

	//注册一个beanDefinition实例
	void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			throws BeanDefinitionStoreException;

    //移除注册表中的beanDefinition实例
	void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    //根据beanName获取beanDefinition实例
	BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    //根据beanName判断是否注册过对应的BeanDefinition实例
	boolean containsBeanDefinition(String beanName);

	//获取所有的beanDefinition实例
	String[] getBeanDefinitionNames();

    //获取获取所有的beanDefinition实例数量
	int getBeanDefinitionCount();

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

}

AliasRegistry接口

BeanDefinitionRegistry接口继承了AliasRegistry接口。
AliasRegistry这个接口的意思是可以给BeanDefinition起个别名,然后注册使用。

查看AliasRegistry接口:

public interface AliasRegistry {


	void registerAlias(String name, String alias);

	void removeAlias(String alias);

	boolean isAlias(String name);

	String[] getAliases(String name);
}

BeanDefinitionRegistry接口层次结构图:
在这里插入图片描述

1. SimpleBeanDefinitionRegistry

SimpleBeanDefinitionRegistry 是 BeanDefinitionRegistry 一个简单的实现,它还继承 SimpleAliasRegistry( AliasRegistry 的简单实现),它仅仅只提供注册表功能,无工厂功能。

public class SimpleBeanDefinitionRegistry extends SimpleAliasRegistry implements BeanDefinitionRegistry {

	private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(64);


	@Override
	public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			throws BeanDefinitionStoreException {

		Assert.hasText(beanName, "'beanName' must not be empty");
		Assert.notNull(beanDefinition, "BeanDefinition must not be null");
		this.beanDefinitionMap.put(beanName, beanDefinition);
	}

	@Override
	public void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
		if (this.beanDefinitionMap.remove(beanName) == null) {
			throw new NoSuchBeanDefinitionException(beanName);
		}
	}

	@Override
	public BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
		BeanDefinition bd = this.beanDefinitionMap.get(beanName);
		if (bd == null) {
			throw new NoSuchBeanDefinitionException(beanName);
		}
		return bd;
	}

	@Override
	public boolean containsBeanDefinition(String beanName) {
		return this.beanDefinitionMap.containsKey(beanName);
	}

	@Override
	public String[] getBeanDefinitionNames() {
		return StringUtils.toStringArray(this.beanDefinitionMap.keySet());
	}

	@Override
	public int getBeanDefinitionCount() {
		return this.beanDefinitionMap.size();
	}

	@Override
	public boolean isBeanNameInUse(String beanName) {
		return isAlias(beanName) || containsBeanDefinition(beanName);
	}

}

2. DefaultListableBeanFactory类

DefaultListableBeanFactory是整个bean加载的核心部分,是spring注册及加载bean的默认实现。DefaultListableBeanFactory 则是一个具有注册功能的完整 bean 工厂

DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory类,实现了ConfigurableListableBeanFactory和BeanDefinitionRegistry接口。

本系列文章就是在详细讲解DefaultListableBeanFactory类。。。

3. GenericApplicationContext类

GenericApplicationContext是一个实现ApplicationContext,它不预设指定任何bean定义格式; 例如XML或注释。

public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry {

	private final DefaultListableBeanFactory beanFactory;

	@Nullable
	private ResourceLoader resourceLoader;

	private boolean customClassLoader = false;

	private final AtomicBoolean refreshed = new AtomicBoolean();

	public GenericApplicationContext() {
		this.beanFactory = new DefaultListableBeanFactory();
	}
}

GenericApplicationContext使用的注册bean依然是使用DefaultListableBeanFactory的实现原理。

2025-08-20T17:09:39.843+08:00 ERROR 6648 --- [PlusDemo3] [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'userMapper' defined in file [D:\project\JavaSSM\PlusDemo3\target\classes\org\example\plusdemo3\mapper\UserMapper.class]: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:864) ~[spring-beans-6.2.9.jar:6.2.9] at org.springframework.beans.factory.support.AbstractBeanFactory.getType(AbstractBeanFactory.java:745) ~[spring-beans-6.2.9.jar:6.2.9] at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAnnotationOnBean(DefaultListableBeanFactory.java:817) ~[spring-beans-6.2.9.jar:6.2.9] at org.springframework.boot.sql.init.dependency.AnnotationDependsOnDatabaseInitializationDetector.detect(AnnotationDependsOnDatabaseInitializationDetector.java:36) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor.detectDependsOnInitializationBeanNames(DatabaseInitializationDependencyConfigurer.java:152) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor.postProcessBeanFactory(DatabaseInitializationDependencyConfigurer.java:115) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:363) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:197) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:791) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:609) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) ~[spring-boot-3.5.4.jar:3.5.4] at org.example.plusdemo3.PlusDemo3Application.main(PlusDemo3Application.java:12) ~[classes/:na]
最新发布
08-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值