Spring BeanFactory体系

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的默认实现

猜你喜欢

转载自juejin.im/post/5d21920be51d455a694f959b