Spring 水滴石穿(四) 工廠實現之bean工廠接口 ConfigurableListableBeanFactory

概述

這個接口提供了DefaultListableBeanFactory的許多功能,本節主要分析這個接口提供的功能,實現後面在分析,先看其接口加強體系。spring

接口體系

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<? extends PropertyEditor> 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();

}
相關文章
相關標籤/搜索