今天看啥  ›  专栏  ›  涣涣虚心0215

Spring IOC(4)ConfigurableListableBeanFactory概览

涣涣虚心0215  · 简书  ·  · 2020-12-08 00:40

文章预览

Spring IOC(3)BeanFactory概览 里面分享了BeanFactory的接口定义,主要提及 ListableBeanFactory

DefaultListableBeanFactory继承关系

ConfigurableListableBeanFactory是继承于ListableBeanFactory、ConfigurableBeanFactory、AutowireCapableBeanFactory

ConfigurableBeanFactory

ConfigurableBeanFactory同时继承了HierarchicalBeanFactory 和 SingletonBeanRegistry 这两个接口,即同时继承了分层和单例类注册的功能。
简单介绍一下SingletonBeanRegistry接口,是专门针对Spring中的单例Bean设计的,提供了统一访问单例Bean的功能,类中定义了以下方法(后续再研究):

public interface SingletonBeanRegistry {
      //注册单例bean
    void registerSingleton(String beanName, Object singletonObject);
      //获取单例bean
    Object getSingleton(String beanName);
    boolean containsSingleton(String beanName);
    String[] getSingletonNames();
    Object getSingletonMutex();
}

回到ConfigurableBeanFactory这个接口,它是spring框架中非常重要的一个接口,定义了非常多的方法:

  • 对父接口中HierarchicalBeanFactory得获取父beanfactory的方法进行set
  • 对类的加载器ClassLoader进行set和get
  • 属性的编辑器PropertyEditorRegistrar,类的转换器TypeConverter进行注册
  • 添加处理bean的后处理器的方法addBeanPostProcessor
  • 2个跟Bean别名相关的方法、1个返回合并后的Bean定义的方法。
  • 对指定的Bean注册依赖并进行返回registerDependentBean
  • 3个销毁bean的方法
  • 1个安全访问上下文的方法AccessControlContext
String SCOPE_SINGLETON = "singleton";//单例
String SCOPE_PROTOTYPE = "prototype";//原型
//设置容器的父容器,获取父容器方法在父接口HierarchicalBeanFactory里
void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
//设置和获取类加载器,主要用于加载Bean,默认是线上上下文的loader
void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);
ClassLoader getBeanClassLoader();
//设置获取临时类加载器
void setTempClassLoader(@Nullable ClassLoader tempClassLoader);
ClassLoader getTempClassLoader();
//设置是否缓存给定BeanDefinition和确定Bean类型的元数据,默认是开启状态.
void setCacheBeanMetadata(boolean cacheBeanMetadata);
boolean isCacheBeanMetadata();
//为beanDefinition值中的表达式提供解决策略.默认的BeanFactory里是没有激活的表达式支持的.
void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver);
BeanExpressionResolver getBeanExpressionResolver();
//设置和获取ConversionService接口,进行数据类型转换
void setConversionService(@Nullable ConversionService conversionService);
ConversionService getConversionService();
//添加一个PropertyEditorRegistrar应用于所有bean的创建过程.
void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
//为所有给定类型的属性注册一个给定的自定义属性编辑器.通常在factory配置期间被调用.
void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);
//使用一个已经在BeanFactory里注册过的自定义属性编辑器来初始化给定的PropertyEditorRegistry.
void copyRegisteredEditorsTo(PropertyEditorRegistry registry);
//设置或获取自定义的类型转换器,BeanFactory用它来对Bean的属性值,构造参数等进行转换.这将会覆盖默认的PropertyEditor机制,
void setTypeConverter(TypeConverter typeConverter);
TypeConverter getTypeConverter();
//用来增加一个嵌入式的StringValueResolver,比如说注解的属性.可以参考SpringMVC中的ArgumentResolver.
void addEmbeddedValueResolver(StringValueResolver valueResolver);
//确定是否有一个嵌入式的value resolver已经在这个bean factory中注册了,并且可以通过resolveEmbeddedValue函数来应用.
boolean hasEmbeddedValueResolver();
//决定一个给定的嵌入式的值,例如注解中的属性
String resolveEmbeddedValue(String value);
//添加一个新的BeanPostProcessor,通过这个工厂所创建的beans将会应用这个后置处理器.
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
//获取已经注册的Bean后置处理器的个数
int getBeanPostProcessorCount();
//注册一个给定的scope,支持Scope的实现类.
void registerScope(String scopeName, Scope scope);
//返回所有当前注册过的scope的名字.这个方法只返回明确注册过的scope的名字
String[] getRegisteredScopeNames();
//如果有的话,返回给定名字的Scope实现.和上一个函数一样,将只返回明确注册过的scope
Scope getRegisteredScope(String scopeName);
//提供一个与这个工厂相关的安全的访问控制上下文.这个绝不会为空.
AccessControlContext getAccessControlContext();
//从给定的工厂中拷贝所有相关的配置信息.应该包括了所有标准的配置,也包括了BeanPostProcessor,Scopes和factory-specific内置的一些配置.
void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);
// 给定一个bean的名字,创建它的别名.这个方法的典型应用是支持那些在XML的ids里是无效的名字(被用于Bean的命名).
void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;
//处理所有目标名称的别名和在这个工厂注册过的别名,然后为它们应用给定的StringValueResolver.
void resolveAliases(StringValueResolver valueResolver);
//返回一个给定名字的合并后的BeanDefinition,如果有必要会将子BeanDefinition和父BeanDefinition进行合并.
BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
//判断给定名字的Bean是否是一个FactoryBean.
boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;
//设置Bean的当前创建状态
void setCurrentlyInCreation(String beanName, boolean inCreation);
boolean isCurrentlyInCreation(String beanName);
//为给定名称的Bean注册一个依赖Bean,并且该依赖Bean会在给定的Bean被销毁之前进行销毁
void registerDependentBean(String beanName, String dependentBeanName);
//如果有的话,返回依赖于给定名字Bean的所有Bean名称.
String[] getDependentBeans(String beanName);
//如果有的话,返回给定名字Bean所依赖的所有Bean名称.
String[] getDependenciesForBean(String beanName);
//依据BeanDefinition,销毁给定Bean的实例,(通常会从这个工厂中获取一个原型实例).
void destroyBean(String beanName, Object beanInstance);
//如果有的话,在当前目标Scope中销毁指定的ScopeBean.
void destroyScopedBean(String beanName);
//销毁这个工厂中所有的singleton bean,包括一次性的已经注册的内嵌Bean.在工厂关闭的时候会被调用.
void destroySingletons();

AutowireCapableBeanFactory

提供了 自动装配Bean的实现 ,提供bean创建(带有构造函数解析)、属性填充、连接(包括自动装配)和初始化。处理运行时bean引用、解析托管集合、调用初始化方法等。支持自动装配构造函数、按名称的属性和按类型的属性。
bean创建过程中,主要的方法比如createBean(), initializeBean(), applyBeanPostProcessorsBeforeInitialization(), applyBeanPostProcessorsAfterInitialization()。
需要注意的是AutowireCapableBeanFactory并不打算给普通的应用程序直接使用,典型的使用场景还是建议使用BeanFactory或者ListableBeanFactory。

public interface AutowireCapableBeanFactory extends BeanFactory {
    int AUTOWIRE_NO = 0;
    int AUTOWIRE_BY_NAME = 1;
    int AUTOWIRE_BY_TYPE = 2;
    int AUTOWIRE_CONSTRUCTOR = 3;
    int AUTOWIRE_AUTODETECT = 4;//已经过期
    String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL";
    //完整初始化所创建bean,包含所有可应用的BeanPostProcessor BeanPostProcessors
    <T> T createBean(Class<T> beanClass) throws BeansException;
    //通过应用初始化之后(after-instantiation)的回调以及bean属性的后置处理(post-processing)
    //  来对给定Bean内部的属性进行装配(e.g. 注解注入).
    void autowireBean(Object existingBean) throws BeansException;
    //配置给定的未加工的bean:自动注入bean的属性,应用bean的属性值,
    Object configureBean(Object existingBean, String beanName) throws BeansException;
    //  依据指定的自动注入策略创建给定class对象的新的bean实例。
    Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
    //使用指定的装配策略来为指定的类型实例化一个新的Bean实例
    Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
    //自动注入给定的bean实例的属性,通过by name 或者 type的方式,
    //  也可以通过AUTOWIRE_NO以实现仅仅对实例化后回调的调用(例如注解驱动的注入)。
    void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
            throws BeansException;
    //应用给定bean名字的bean定义的属性值到给定的bean实例
    void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;
    //初始化指定的原始bean
    Object initializeBean(Object existingBean, String beanName) throws BeansException;
    //应用后置处理器(BeanPostProcessor BeanPostProcessors)于指定的已存在的bean实例
    //返回的对象可能是一个原始对象的包装对象
    Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
            throws BeansException;
    //应用后置处理器(BeanPostProcessor BeanPostProcessors)于指定的已存在的bean实例
    //返回的对象可能是一个原始对象的包装对象
    Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
            throws BeansException;
    //销毁指定的bean实例
    void destroyBean(Object existingBean);
    //解决惟一匹配指定类型的实例,包括实例的bean名称。
    <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;
    //解决此bean工厂中定义的指定的bean依赖。
    Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;
    Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,
            @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException;
}

ConfigurableListableBeanFactory

ConfigurableListableBeanFactory提供bean definition的解析,注册功能,以及singleton的预实例化(解决循环依赖问题)

public interface ConfigurableListableBeanFactory
        extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
    //在装配的时候忽略指定的依赖类型
    void ignoreDependencyType(Class<?> type);
    //在装配的时候忽略指定的依赖接口
    void ignoreDependencyInterface(Class<?> ifc);
    //注册一个指定的依赖类型并放入可供注入的值
    void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue);
    //确定一个指定的Bean是否有资格作为自动注入的候选,如果有的话,
    // 它将可能会被注入到那些声明了匹配类型依赖的其它Bean中,这个方法也会检查父级的factory
    boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor)
            throws NoSuchBeanDefinitionException;
    //获取bean定义 (可以访问属性值跟构造方法的参数值)
    BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
    //为所有被这个工厂所管理的Bean的名称返回一个统一的视图
    Iterator<String> getBeanNamesIterator();
    //清理被合并的BeanDefinition缓存,也会移除那些元数据缓存不完整的那些Bean的实体
    void clearMetadataCache();
    //锁定配置信息.在调用refresh时会使用到.
    void freezeConfiguration();
    //判断本工厂配置是否被冻结
    boolean isConfigurationFrozen();
    //确保所有non-lazy-init的单例被实例化,也包括FactoryBeans.
    //  如果有需求的话,通常是在factory启动的最后调用这个方法,refresh的主要方法
    void preInstantiateSingletons() throws BeansException;
}
………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览