BeanFactory及其子类
BeanFactory接口
主要定义了以下方法,这是比较常用的
- 一系列getBean方法.从容器中获得Bean
- By Name
- By Class
- By Name + Class
- isSingleton(Str)/isPrototype(Str) 在容器中是单例还是原型
- containsBean(String var1) 容器中是否有这个Bean
容器中使用Str name唯一标识Bean
从上图可以看出BeanFactory接口共有三个子类
ListableBeanFactory接口
extends BeanFactory 后增强BeanFactory接口
容器可以以列表的形式提供Bean的相关信息
主要定义了以下方法
- int getBeanDefinitionCount() 容器中Bean数量
- String[] getBeanDefinitionNames 获取所有Bean定义的名字
- String[] getBeanNamesForType 根据类型获取所有Bean定义的名字
HierarchicalBeanFactory接口
extends BeanFactory 后增强BeanFactory接口
容器可以有层级关系的
public interface HierarchicalBeanFactory extends BeanFactory {
// 获得父容器
@Nullable
BeanFactory getParentBeanFactory();
// 本地容器是否存在Bean
boolean containsLocalBean(String var1);
}
复制代码
AutowireCapableBeanFactory接口
extends BeanFactory 后增强BeanFactory接口
容器可以自动装配Bean的能力
主要定义了以下方法:
- createBean创建Bean
- applyBeanPropertyValues 设置Bean的属性
- initializeBean初始化Bean
- applyBeanPostProcessorsBeforeInitialization 设置初始化前处理
- applyBeanPostProcessorsAfterInitialization 设置初始化后处理
- destroyBean 销毁Bean
ConfigurableBeanFactory接口
extends HierarchicalBeanFactory,SingletonBeanRegistry
IOC容器可配置的能力,
设置父容器,设置容器的类装载器,属性编辑器,容器通用的Bean初始化后置处理器等方法;
几乎所有的beanFactory都会实现这个接口,赋予了BeanFactory可扩展的功能。
SingletonBeanRegistry 接口
容器单例Bean相关的能力(在运行期间向容器注册单实例Bean)
- registerSingleton
- getSingleton
- containsSingleton
- getSingletonCount
整合接口ConfigurableListableBeanFactory
public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory
复制代码
整合了BeanFactory体系的接口
主要拓展了以下方法
- getBeanDefinition 访问BeanDefinition
- preInstantiateSingletons 预实例化singleton列表
- isAutowireCandidate 给定nama的Bean是否可以作为依赖注入的备选
BeanDefinitionRegistry
向容器中注册Bean的能力
BeanDefinitionRegistry
spring配置文件中的每一个bean节点元素在spring容器里都通过一个BeanDefinition对象表示,描述了Bean的配置信息。
BeanDefinitionRegistry接口提供了向容器手工注册BeanDefinition对象的方法
public interface BeanDefinitionRegistry extends AliasRegistry {
//注册BeanBeanDefinition
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException;
//移除BeanBeanDefinition
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
//获得BeanDefinition
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
boolean containsBeanDefinition(String beanName);
String[] getBeanDefinitionNames();
int getBeanDefinitionCount();
boolean isBeanNameInUse(String beanName);
}
复制代码
管理别名的公共接口 AliasRegistry
public interface AliasRegistry {
//注册一个别名
void registerAlias(String name, String alias);
//删除别名
void removeAlias(String alias);
//判断是否是别名
boolean isAlias(String beanName);
//获得一个名字的所有别名,以String数组的形式返回
String[] getAliases(String name);
}
复制代码
重要的整合 - DefaultListableBeanFactory
我们终于可以看一眼全貌
左侧是我们看过的BeanFactory体系,右侧是BeanDefinitionRegistry和抽象类实现
DefaultListableBeanFactory实现了ConfigurableListableBeanFactory,也就是实现了在BeanFactory体系讲过的能力.
实现了BeanDefinitionRegistry,拥有向容器注册Bean的基本能力
当然还有其他一些,比如SingletonBeannRegistry.
接口的能力是在继承的抽象类逐渐实现的,比如AbstractFactory和AbstractAutowireCapableBeanFactory.
DefaultListableBeanFactory是整个bean加载的核心部分,是Spring注册及加载bean的默认实现