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

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的实现原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值