DefaultListableBeanFactory工厂继承关系解析

概要

最近开始学习Spring,打算从IOC入手。今天主要了解了目前Spring使用的默认bean工厂方法:DefaultListableBeanFactory。
主要了解其继承关系以及各个超类的作用。

继承关系

  • DefaultListableBeanFactory继承和实现的类如下:

    • 继承AbstractAutowireCapableBeanFactory抽象类,bean工厂的基本实现,主要包含工厂的配置、bean属性的装配、bean的创建、bean的初始化、bean的注册、bean的别名管理等功能;
    • 实现ConfigurableListableBeanFactory接口,实现对工厂的配置以及对bean属性的自动装配;
    • 实现BeanDefinitionRegistry接口,bean的注册和别名管理;
    • 实现Serializable接口:序列化接口;
  • 注意:由于上面的类中有对同一个接口的重复继承,所以从描述上来看功能会有些重复。但bean工厂主要的功能是:bean的创建、bean管理、bean的别名管理,bean的初始化、bean的注册、bean属性的装配、bean工厂本身的配置

  • 详细的继承关系图

各个类的作用

  • BeanFactory接口,在包org.springframework.beans.factory下面。
    • 作用:
      • 它是所有工厂类的超类,主要定义了对bean的获取、判断bean是否存在、是否为单例等功能;
    • 定义的方法如下:
      • Object getBean(String name) throws BeansException;根据bean的名称获取bean;
      • T getBean(String name, Class requiredType) throws BeansException;根据bean的名称和类型;
      • Object getBean(String name, Object… args) throws BeansException;根据bean名称获取bean,允许指定显式构造函数参数/工厂方法参数,覆盖bean定义中指定的默认参数(如果有);
      • T getBean(Class requiredType, Object… args) throws BeansException;根据bean类型获取bean,允许指定显式构造函数参数/工厂方法参数,覆盖bean定义中指定的默认参数(如果有);
      • boolean containsBean(String name);根据bean名称判断容器中该bean是否存在;
      • boolean isSingleton(String name) throws NoSuchBeanDefinitionException;判断该bean是否是单例的;
      • boolean isPrototype(String name) throws NoSuchBeanDefinitionException;暂时不清楚;
      • boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;检查该bean是否为指定的类型;
      • boolean isTypeMatch(String name, Class< ? > typeToMatch) throws NoSuchBeanDefinitionException;检查该bean是否为指定的类型;
      • Class< ? > getType(String name) throws NoSuchBeanDefinitionException;返回指定bean的类型;
  • 接口AutowireCapableBeanFactory,在org.springframework.beans.factory.config包下面。
    • 作用:
      • AutowireCapableBeanFactory,这是一个自动注入的ioc bean工厂接口,它继承了BeanFactory接口;实现AutowireCapableBeanFactory接口的工厂需要完成自动注入;
    • 定义的方法:
      • T createBean(Class beanClass) throws BeansException;完全创建给定类的新bean实例。 执行bean的完全初始化,包括所有适用的{@link BeanPostProcessor BeanPostProcessors};
      • void autowireBean(Object existingBean) throws BeansException;通过应用后实例化回调和bean属性后处理(例如,用于注释驱动注入)来填充给定的bean实例。 注意:这主要用于(重新)填充带注释的字段和方法,用于新实例或反序列化实例。 它不意味着传统的名字或类型的自动装配属性;
      • Object configureBean(Object existingBean, String beanName) throws BeansException;配置给定的原始bean:autowiring bean属性,应用bean属性值,应用工厂回调,如{@code setBeanName}和{@code setBeanFactory},以及应用所有bean后处理器(包括可能包装给定原始bean的那些)。 这实际上是{@link #initializeBean}提供的超集,完全应用相应bean定义指定的配置。 注意:此方法需要给定名称的bean定义;
  • 下面的方法表示更细粒度的操作:
    • Object createBean(Class< ? > beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;创建bean,指定注入方式,使用指定的autowire策略完全创建给定类的新bean实例。 此处支持此接口中定义的所有常量;第二个参数是该接口中定义的,如下:int AUTOWIRE_NO = 0;int AUTOWIRE_BY_NAME = 1;int AUTOWIRE_BY_TYPE = 2;int AUTOWIRE_CONSTRUCTOR = 3;int AUTOWIRE_AUTODETECT = 4;
    • Object autowire(Class< ? > beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;对bean进行属性注入,且置顶注入方式;
    • void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck) throws BeansException;按名称或类型自动装配给定bean实例的bean属性。 也可以使用{@code AUTOWIRE_NO}调用,以便仅应用后实例化回调(例如,用于注释驱动的注入)。 是否应用标准{@link BeanPostProcessor BeanPostProcessors}回调或执行bean的任何进一步初始化。 此接口为这些目的提供了独特的细粒度操作;
    • void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;与上个方法的作用一样,都是把现有的bean的属性值,赋值给其他bean(根据名称,上一个方法是根据类型)的属性。将具有给定名称的bean定义的属性值应用于给定的bean实例。 bean定义可以定义完全自包含的bean,重用其属性值,也可以只定义用于现有bean实例的属性值。 此方法不会自动装配bean属性; 它只是应用明确定义的属性值;
    • Object initializeBean(Object existingBean, String beanName) throws BeansException;初始化给定的原始bean,应用工厂回调,例如{@code setBeanName}和{@code setBeanFactory},同时应用所有bean后处理器(包括可能包装给定原始bean的那些)。 请注意,bean工厂中不必存在给定名称的bean定义。 传入的bean名称将仅用于回调,但不会根据已注册的bean定义进行检查;
    • Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException;将{@link BeanPostProcessor BeanPostProcessors}应用于给定的现有bean实例,调用它们的{@code postProcessBeforeInitialization}方法。 返回的bean实例可能是原始实例的包装器;
    • Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException;
    • void destroyBean(Object existingBean);销毁给定的bean实例(通常来自{@link #createBean}),使用{@link org.springframework.beans.factory.DisposableBean}合同以及注册的{@link DestructionAwareBeanPostProcessor DestructionAwareBeanPostProcessors}。 应该捕获在破坏期间出现的任何异常;
    • NamedBeanHolder resolveNamedBean(Class requiredType) throws BeansException;解析与给定对象类型唯一匹配的bean实例(如果有),包括其bean名称。 这实际上是{@link #getBean(Class)}的变体,它保留匹配实例的bean名称;
    • Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName) throws BeansException;针对此工厂中定义的bean解析指定的依赖项;
    • Objec resolveDependency(DependencyDescriptor descriptor, String requestingBeanName, Set autowiredBeanNames, TypeConverter typeConverter) throws BeansException;
  • 接口public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry{……}。
    • 作用:
      • 该接口定义了对工厂bean的配置方法。配置接口由大多数bean工厂实现。 除了{@link org.springframework.beans.factory.BeanFactory}接口中的bean工厂客户端方法之外,还提供配置bean工厂的工具。
    • 下面列举一些方法的定义:
      • 方法void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
      • void setBeanClassLoader(ClassLoader beanClassLoader);
      • ClassLoader getBeanClassLoader();
      • void setTempClassLoader(ClassLoader tempClassLoader);
      • ClassLoader getTempClassLoader();
      • void setCacheBeanMetadata(boolean cacheBeanMetadata);
      • boolean isCacheBeanMetadata();
      • void setBeanExpressionResolver(BeanExpressionResolver resolver);
      • BeanExpressionResolver getBeanExpressionResolver();
      • void setConversionService(ConversionService conversionService);
      • ConversionService getConversionService();
      • void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
      • void registerCustomEditor(Class< ? > requiredType, Class< ? extends PropertyEditor> propertyEditorClass);
      • void copyRegisteredEditorsTo(PropertyEditorRegistry registry);
      • void setTypeConverter(TypeConverter typeConverter);
      • TypeConverter getTypeConverter();
      • void addEmbeddedValueResolver(StringValueResolver valueResolver);
      • boolean hasEmbeddedValueResolver();
      • String resolveEmbeddedValue(String value);
      • void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
      • int getBeanPostProcessorCount();
      • ……
  • 接口public interface HierarchicalBeanFactory extends BeanFactory {……}。
    • 作用:
      • 该接口定义了bean工厂的父级bean工厂。由bean工厂实现的子接口,可以是层次结构的一部分;
    • 只定义了两个方法:
      • BeanFactory getParentBeanFactory();
      • boolean containsLocalBean(String name);
  • 接口public interface SingletonBeanRegistry {……}。
    • 作用: 这是一个单例的bean工厂。为共享bean实例定义注册表的接口。 可以通过{@link org.springframework.beans.factory.BeanFactory}实现来实现,以便以统一的方式公开它们的单例管理工具。
    • 定义了以下几个方法:
      • void registerSingleton(String beanName, Object singletonObject);
      • Object getSingleton(String beanName);
      • boolean containsSingleton(String beanName);
      • String[] getSingletonNames();
      • int getSingletonCount();
      • Object getSingletonMutex();
  • 类public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {……}。
    • 作用:这是一个单例bean的注册表。共享bean实例的通用注册表,实现{@link org.springframework.beans.factory.config.SingletonBeanRegistry}。 允许通过bean名称注册应该为注册表的所有调用者共享的单例实例。
  • 接口public interface AliasRegistry {……}。
    • 作用:管理别名的通用接口。用于管理别名的通用接口。 用作{@link org.springframework.beans.factory.support.BeanDefinitionRegistry}的超级接口。
    • 定义的方法:
      • void registerAlias(String name, String alias);
      • void removeAlias(String alias);
      • boolean isAlias(String name);
      • String[] getAliases(String name);
  • 类public class SimpleAliasRegistry implements AliasRegistry {……}
    • 作用:接口AliasRegisttry的实现类;
  • 抽象类public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanRegistry {……}
    • 作用:支持需要处理{@link org.springframework.beans.factory.FactoryBean}实例的单例注册表的基类,并与{@link DefaultSingletonBeanRegistry}的单例管理集成。
  • 抽象类public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {……}
    • 作用:{@link org.springframework.beans.factory.BeanFactory实现的抽象基类,提供{@link org.springframework.beans.factory.config.ConfigurableBeanFactory} SPI的全部功能。 不假设可列出的bean工厂:因此也可以用作bean工厂实现的基类,它从某些后端资源获取bean定义(其中bean定义访问是一项昂贵的操作)。
  • 抽象类public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory {}。
    • 作用:抽象bean工厂超类,它实现了默认的bean创建,具有{@link RootBeanDefinition}类指定的全部功能。 除了AbstractBeanFactory的{@link #createBean}方法之外,还实现了{@link org.springframework.beans.factory.config.AutowireCapableBeanFactory}接口。
  • 类public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {……}
    • 作用
      • {@link org.springframework.beans.factory.ListableBeanFactory}和{@link BeanDefinitionRegistry}接口的默认实现:基于bean定义对象的完整bean工厂。
      • 典型用法是在访问bean之前首先注册所有bean定义(可能从bean定义文件中读取)。 因此,Bean定义查找在本地bean定义表中是一种廉价的操作,对预构建的bean定义元数据对象进行操作。
      • 可以用作独立的bean工厂,也可以用作自定义bean工厂的超类。 请注意,特定bean定义格式的读者通常是单独实现而不是作为bean工厂子类实现:请参阅示例{@link PropertiesBeanDefinitionReader}和{@link org.springframework.beans.factory.xml.XmlBeanDefinitionReader}。
  • 接口public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {……}
    • 作用
      • 配置接口由大多数可列出的bean工厂实现。 除了{@link ConfigurableBeanFactory}之外,它还提供了分析和修改bean定义以及预先实例化单例的工具。
  • 接口public interface ListableBeanFactory extends BeanFactory {……}
    • 作用:{@link BeanFactory}接口的扩展由bean工厂实现,可以枚举所有bean实例,而不是按客户端的请求逐个尝试按名称查找bean。 预加载所有bean定义(例如基于XML的工厂)的BeanFactory实现可以实现此接口。
    • 定义的方法
      • boolean containsBeanDefinition(String beanName);
      • int getBeanDefinitionCount();
      • String[] getBeanDefinitionNames();
      • String[] getBeanNamesForType(ResolvableType type);
      • String[] getBeanNamesForType(Class< ? > type);
      • String[] getBeanNamesForType(Class< ? > type, boolean includeNonSingletons, boolean allowEagerInit);
      • < T> Map< String, T> getBeansOfType(Class< T> type) throws BeansException;
      • < T> Map< String, T> getBeansOfType(Class< T> type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException;
      • String[] getBeanNamesForAnnotation(Class< ? extends Annotation> annotationType);
      • Map< String, Object> getBeansWithAnnotation(Class< ? extends Annotation> annotationType) throws BeansException;
      • < A extends Annotation> A findAnnotationOnBean(String beanName, Class< A> annotationType)
        throws NoSuchBeanDefinitionException;
  • 接口public interface BeanDefinitionRegistry extends AliasRegistry {……}
    • 作用:包含bean定义的注册表的接口,例如RootBeanDefinition和ChildBeanDefinition实例。 通常由BeanFactories实现,BeanFactories内部使用AbstractBeanDefinition层次结构。
    • 定义的方法:
      • void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;
      • void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
      • BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
      • boolean containsBeanDefinition(String beanName);
      • String[] getBeanDefinitionNames();
      • int getBeanDefinitionCount();
      • boolean isBeanNameInUse(String beanName);
  • 类public class ResolvableType implements Serializable {……}
    • 作用:可解决的数据类型。它为java语言中的所有类型提供了相同的数据结构,其内部封装了一个java.lang.reflect.Type类型的对象;
    • 使用场景:使用场景是非常广泛的,在spring框架中需要反射的时候,为了不丢失泛型信息,通常都会使用ResolvableType封装所有的类型

猜你喜欢

转载自blog.csdn.net/Growing_stu/article/details/82288954