1. 作用
BeanDefinitionRegistry是Spring IOC核心之一;Spring对每一个Bean生成的BeanDefinition都是通过这个接口的行为进行注册、删除、获取等等操作,用于IOC实例Bean的对象时使用;
2. 源码
public interface BeanDefinitionRegistry extends AliasRegistry {
// 注册BeanDefinition
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException;
// 删除BeanDefinition, 如果beanName不存在将抛出NoSuchBeanDefinitionException异常
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
// 获取BeanDefinition, 如果beanName不存在将抛出NoSuchBeanDefinitionException异常
BeanDefinition getBeanDefinition(String beanName)
throws NoSuchBeanDefinitionException;
// 检查注册的BeanDefinition中是否包含beanName
boolean containsBeanDefinition(String beanName);
// 获取注册的所有BeanDefinition的beanName
String[] getBeanDefinitionNames();
// 获取注册的BeanDefinition的数量
int getBeanDefinitionCount();
// 判断beanName是否已使用
boolean isBeanNameInUse(String beanName);
}
3. UML图
类说明:
-
DefaultListableBeanFactory
是BeanDefinitionRegistry
接口最重要的的实现类,它是整个Spring中BeanDefinition注册的核心,无论是低级容器、高级容器、基于XML、还是基于注解的Spring IOC,都是使用的该类; -
GenericApplicationContext
类除了实现了BeanDefinitionRegistry
接口,还继承了AbstractApplicationContext
类,其设计目的是为了通用,但该类有一个DefaultListableBeanFactory
类型的成员变量beanFactory,而且是在构造函数中实例化的,对BeanDefinitionRegistry
接口抽象方法的实现都是调用的beanFactory实例的方法(装饰模式);public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry { private final DefaultListableBeanFactory beanFactory; // ...... public GenericApplicationContext() { this.beanFactory = new DefaultListableBeanFactory(); } public GenericApplicationContext(DefaultListableBeanFactory beanFactory) { Assert.notNull(beanFactory, "BeanFactory must not be null"); this.beanFactory = beanFactory; } // ...... }
-
AnnotationConfigApplicationContext
继承了GenericApplicationContext
,提供了注解配置和类路劲扫描的支持; -
GenericXmlApplicationContext
继承了GenericApplicationContext
,提供了XML的支持;