1. 程式人生 > >容器之beanfactory抽絲剝繭系列一

容器之beanfactory抽絲剝繭系列一

1.總所周知,spring ioc功能實現的頂層介面就是BeanFactory。如下面類結構圖

這張更加全面:

還有更加變態的

2.BeanFactory為最頂層介面,定義了最核心的需要實現的介面

package org.springframework.beans.factory;

public interface BeanFactory {

    /**
     * 用來引用一個例項,或把它和工廠產生的Bean區分開,就是說,如果一個FactoryBean的名字為a,那麼,&a會得到那個Factory
     */
    String FACTORY_BEAN_PREFIX 
= "&"; /* * 四個不同形式的getBean方法,獲取例項 */ Object getBean(String name) throws BeansException; <T> T getBean(String name, Class<T> requiredType) throws BeansException; <T> T getBean(Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args)
throws BeansException; boolean containsBean(String name); // 是否存在 boolean isSingleton(String name) throws NoSuchBeanDefinitionException;// 是否為單例項 boolean isPrototype(String name) throws NoSuchBeanDefinitionException;// 是否為原型(多例項) boolean isTypeMatch(String name, Class<?> targetType)
throws NoSuchBeanDefinitionException;// 名稱、型別是否匹配 Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 獲取型別 String[] getAliases(String name);// 根據例項的名字獲取例項的別名 }
View Code

3.分層的Bean工廠:HierarchicalBeanFactory,定義工廠之間的層級關係

public interface HierarchicalBeanFactory extends BeanFactory {

    BeanFactory getParentBeanFactory();    //  返回本Bean工廠的父工廠

    boolean containsLocalBean(String name);    //  本地工廠是否包含這個Bean,忽略其他所有父工廠

}

4.可將Bean逐一列出的工廠——ListableBeanFactory

 

public interface ListableBeanFactory extends BeanFactory {

    boolean containsBeanDefinition(String beanName); // 對於給定的名字是否含有BeanDefinition

    int getBeanDefinitionCount(); // 返回工廠的BeanDefinition總數

    String[] getBeanDefinitionNames(); // 返回工廠中所有Bean的名字

    String[] getBeanNamesForType(Class<?> type); // 返回對於指定型別Bean(包括子類)的所有名字

    /*
     * 返回指定型別的名字 includeNonSingletons為false表示只取單例Bean,true則不是
     * allowEagerInit為true表示立刻載入,false表示延遲載入。 注意:FactoryBeans都是立刻載入的。
     */
    String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons,
            boolean allowEagerInit);

    <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException; // 根據型別(包括子類)返回指定Bean名和Bean的Map

    <T> Map<String, T> getBeansOfType(Class<T> type,
            boolean includeNonSingletons, boolean allowEagerInit)
            throws BeansException;

    Map<String, Object> getBeansWithAnnotation(
            Class<? extends Annotation> annotationType) throws BeansException; // 根據註解型別,查詢所有有這個註解的Bean名和Bean的Map

    <A extends Annotation> A findAnnotationOnBean(String beanName,
            Class<A> annotationType);// 根據指定Bean名和註解型別查詢指定的Bean

}

5.自動裝配的Bean工廠——AutowireCapableBeanFactory

public interface AutowireCapableBeanFactory extends BeanFactory {

    int AUTOWIRE_NO = 0;   //  這個常量表明工廠沒有自動裝配的Bean

    int AUTOWIRE_BY_NAME = 1;  //表明根據名稱自動裝配

    int AUTOWIRE_BY_TYPE = 2;  //表明根據型別自動裝配

    int AUTOWIRE_CONSTRUCTOR = 3;  //表明根據構造方法快速裝配

    @Deprecated
    int AUTOWIRE_AUTODETECT = 4;   //表明通過Bean的class的內部來自動裝配(有沒翻譯錯...)Spring3.0被棄用。

    <T> T createBean(Class<T> beanClass) throws BeansException;    //  根據指定Class建立一個全新的Bean例項

    void autowireBean(Object existingBean) throws BeansException;  //  給定物件,根據註釋、後處理器等,進行自動裝配

    /*
     * 根據Bean名的BeanDefinition裝配這個未加工的Object,執行回撥和各種後處理器。
     */
    Object configureBean(Object existingBean, String beanName) throws BeansException;

    /*
     * 分解Bean在工廠中定義的這個指定的依賴descriptor
     */
    Object resolveDependency(DependencyDescriptor descriptor, String beanName) throws BeansException;

    /*
     * 根據給定的型別和指定的裝配策略,建立一個新的Bean例項
     */
    Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;

    /*
     * 與上面類似,不過稍有不同。
     */
    Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;

    /*
     * 根據名稱或型別自動裝配
     */
    void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
            throws BeansException;

    /*
     * 也是自動裝配
     */
    void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;

    /*
     * 初始化一個Bean...
     */
    Object initializeBean(Object existingBean, String beanName) throws BeansException;

    /*
     * 初始化之前執行BeanPostProcessors
     */
    Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
            throws BeansException;
    /*
     * 初始化之後執行BeanPostProcessors
     */
    Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
            throws BeansException;

    /*
     * 分解指定的依賴
     */
    Object resolveDependency(DependencyDescriptor descriptor, String beanName,
            Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException;

}
View Code

6.複雜的配置Bean工廠——ConfigurableBeanFactory

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {

    String SCOPE_SINGLETON = "singleton";  //  單例

    String SCOPE_PROTOTYPE = "prototype";  //  原型

    /*
     * 搭配HierarchicalBeanFactory介面的getParentBeanFactory方法
     */
    void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;

    /*
     * 設定、返回工廠的類載入器
     */
    void setBeanClassLoader(ClassLoader beanClassLoader);

    ClassLoader getBeanClassLoader();

    /*
     * 設定、返回一個臨時的類載入器
     */
    void setTempClassLoader(ClassLoader tempClassLoader);

    ClassLoader getTempClassLoader();

    /*
     * 設定、是否快取元資料,如果false,那麼每次請求例項,都會從類載入器重新載入(熱載入)

     */
    void setCacheBeanMetadata(boolean cacheBeanMetadata);
    
    boolean isCacheBeanMetadata();//是否快取元資料

    /*
     * Bean表示式分解器
     */
    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();

    /*
     * 增加一個嵌入式的StringValueResolver
     */
    void addEmbeddedValueResolver(StringValueResolver valueResolver);

    String resolveEmbeddedValue(String value);//分解指定的嵌入式的值

    void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);//設定一個Bean後處理器

    int getBeanPostProcessorCount();//返回Bean後處理器的數量

    void registerScope(String scopeName, Scope scope);//註冊範圍

    String[] getRegisteredScopeNames();//返回註冊的範圍名

    Scope getRegisteredScope(String scopeName);//返回指定的範圍

    AccessControlContext getAccessControlContext();//返回本工廠的一個安全訪問上下文

    void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);//從其他的工廠複製相關的所有配置

    /*
     * 給指定的Bean註冊別名
     */
    void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;

    void resolveAliases(StringValueResolver valueResolver);//根據指定的StringValueResolver移除所有的別名

    /*
     * 返回指定Bean合併後的Bean定義
     */
    BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;//判斷指定Bean是否為一個工廠Bean

    void setCurrentlyInCreation(String beanName, boolean inCreation);//設定一個Bean是否正在建立

    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);//銷燬指定的Bean

    void destroyScopedBean(String beanName);//銷燬指定的範圍Bean

    void destroySingletons();  //銷燬所有的單例類

}
View Code

在具體介紹之前,先看一下介面SingletonBeanRegistry的原始碼:

public interface SingletonBeanRegistry {

    void registerSingleton(String beanName, Object singletonObject); //在容器內註冊一個單例類  
    
    Object getSingleton(String beanName);//返回給定名稱對應的單例類

    boolean containsSingleton(String beanName);//給定名稱是否對應單例類

    String[] getSingletonNames();//返回容器內所有單例類的名字

    int getSingletonCount();//返回容器內註冊的單例類數量

}

SingletonBeanRegistry這個介面非常簡單,5個方法,實現了單例類註冊的功能。

ConfigurableBeanFactory同時繼承了HierarchicalBeanFactory 和 SingletonBeanRegistry 這兩個介面,即同時繼承了分層和單例類註冊的功能。

7.BeanFactory的集大成者:ConfigurableListableBeanFactory

public interface ConfigurableListableBeanFactory
        extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {

    void ignoreDependencyType(Class<?> type);//忽略自動裝配的依賴型別

    void ignoreDependencyInterface(Class<?> ifc);//忽略自動裝配的介面
    /*
     * 註冊一個可分解的依賴
     */
    void registerResolvableDependency(Class<?> dependencyType, Object autowiredValue);
    /*
     * 判斷指定的Bean是否有資格作為自動裝配的候選者
     */
    boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException;
    /*
     * 返回註冊的Bean定義
     */
    BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    void freezeConfiguration();//暫時凍結所有的Bean配置

    boolean isConfigurationFrozen();//判斷本工廠配置是否被凍結

    void preInstantiateSingletons() throws BeansException;//使所有的非延遲載入的單例類都例項化。

}

 

8.額外的介面:BeanDefinitionRegistry

這個介面基本用來操作定義在工廠內部的BeanDefinition的。我們先來看一下這個介面的父介面:

public interface AliasRegistry {

    void registerAlias(String name, String alias);//對指定的名稱註冊別名

    void removeAlias(String alias);//從當前容器移除指定別名

    boolean isAlias(String beanName);//判斷指定名稱是否為別名

    String[] getAliases(String name);//返回指定名稱的所有別名

}

可以看到這4個方法都非常簡單,都是用來操作別名的。

再來看一下BeanDefinitionRegistry的原始碼:

public interface BeanDefinitionRegistry extends AliasRegistry {

    void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;//給定bean名稱,註冊一個新的bean定義
    /*
     * 根據指定Bean名移除對應的Bean定義
     */
    void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
    /*
     * 根據指定bean名得到對應的Bean定義
     */
    BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
    /*
     * 查詢,指定的Bean名是否包含Bean定義
     */
    boolean containsBeanDefinition(String beanName);

    String[] getBeanDefinitionNames();//返回本容器內所有註冊的Bean定義名稱

    int getBeanDefinitionCount();//返回本容器內註冊的Bean定義數目

    boolean isBeanNameInUse(String beanName);//指定Bean名是否被註冊過。

}