文章目录
spring基础 核心类DefaultListableBeanFactory(二):BeanDefinitionRegistry接口
DefaultListableBeanFactory是整个bean加载的核心部分,是spring注册及加载bean的默认实现。
DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory类,实现了ConfigurableListableBeanFactory和BeanDefinitionRegistry接口。
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
}
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的实现原理。