Spring 水滴石穿(四) 工厂实现之bean工厂接口 ConfigurableListableBeanFactory

概述

这个接口提供了DefaultListableBeanFactory的许多功能,本节主要分析这个接口提供的功能,实现后面在分析,先看其接口增强体系。

接口体系

image
可以看到这里除了继承我们第二节中提到的三大工厂接口外,还继承了一个单例注册接口和可配置的工厂接口,我们接下来先看看这俩个接口提供了什么功能

SingletonBeanRegistry

这个接口正如其名,提供单例的管理功能,包括注册,获取等功能

public interface SingletonBeanRegistry {

    //注册单例
    void registerSingleton(String beanName, Object singletonObject);
    //获取单例
    @Nullable
    Object getSingleton(String beanName);

    //校验是否存在单例
    boolean containsSingleton(String beanName);

    //获取所有单例名
    String[] getSingletonNames();

    //获取所有单例的数目
    int getSingletonCount();

    //返回一个单例互斥对象
    Object getSingletonMutex();

ConfigurableBeanFactory

这个接口就是增强bean工厂的可配置能力,具体看注释

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {

    //范围标识符,可以调用registerScope方法增加
    String SCOPE_SINGLETON = "singleton";
    String SCOPE_PROTOTYPE = "prototype";


    //设置父工厂
    void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;

    //设置和获取bean的类加载器
    void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);
    @Nullable
    ClassLoader getBeanClassLoader();

    //设置和获取一个临时类加载器
    void setTempClassLoader(@Nullable ClassLoader tempClassLoader);
    @Nullable
    ClassLoader getTempClassLoader();

    //设置和获取是否缓存bean的元数据
    void setCacheBeanMetadata(boolean cacheBeanMetadata);
    boolean isCacheBeanMetadata();

    //设置和获取bean定义的解析策略
    void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver);
    @Nullable
    BeanExpressionResolver getBeanExpressionResolver();

     //spring 3.0提供的新功能 设置和获取转换服务处理属性值,可以作为属性编辑器的一个替代
    void setConversionService(@Nullable ConversionService conversionService);
    @Nullable
    ConversionService getConversionService();

    //增加一个自定义属性处理器工厂,这个方法避免了同步,推荐使用
    void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);

    //注册一个自定义属性处理器来处理指定类型的属性,注意这个自定义属性处理器是共用的,因此需要使用同步关键字保证线程安全,为了避免同步可以使用addPropertyEditorRegistrar方法
    void registerCustomEditor(Class requiredType, Class propertyEditorClass);

    //用已经注册的属性处理器初始化属性处理器工厂
    void copyRegisteredEditorsTo(PropertyEditorRegistry registry);

    //设置一个类型转化器处理属性值,这会重写默认的属性处理器机制
    void setTypeConverter(TypeConverter typeConverter);

    //获取类型转换器,这个通常不是线程安全的,如果默认的属性处理器机制被激活,一般返回的这个类型转换器会唤醒所有已经注册的属性处理器
    TypeConverter getTypeConverter();

    //增加一个string解析器来处理内嵌值,比如注解属性
    void addEmbeddedValueResolver(StringValueResolver valueResolver);

    boolean hasEmbeddedValueResolver();

    @Nullable
    String resolveEmbeddedValue(String value);

    //增加一个bean后置处理器,在bean创建时将以它们注册时候的顺序调用
    void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
    int getBeanPostProcessorCount();

    //注册范围,还记得默认的单例和原型范围吗?
    void registerScope(String scopeName, Scope scope);

    
    String[] getRegisteredScopeNames();

    @Nullable
    Scope getRegisteredScope(String scopeName);

    //提供一个安全访问上下文
    AccessControlContext getAccessControlContext();

    //从其他bean工厂 copy配置来初始化自己
    void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);

    //注册别名,可以运行时调用,因此需要同步
    void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;

    //使用指定的string解析器处理别名
    void resolveAliases(StringValueResolver valueResolver);

    //合并bean定义,因为我们是父子工厂,所以必要的时候需要合并
    BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    //校验是否是个工厂bean
    boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;

    //设置bean正在创建的状态,只限于容器内部使用
    void setCurrentlyInCreation(String beanName, boolean inCreation);

    boolean isCurrentlyInCreation(String beanName);

    //注册依赖的bean
    void registerDependentBean(String beanName, String dependentBeanName);
    
    //获取依赖指定bean的所有bean
    String[] getDependentBeans(String beanName);
    //获取指定bean的所有依赖bean,注意与上面的区别
    String[] getDependenciesForBean(String beanName);

    //销毁给定的bean,通常是原型bean
    void destroyBean(String beanName, Object beanInstance);

    void destroyScopedBean(String beanName);

    //销毁所有的单例,一般是容器关闭时调用
    void destroySingletons();

}

你可能感兴趣的:(spring,java)