2、BeanFactory源碼分析

BeanFactory提供最基本的Ioc容器的功能,BeanFactory只是一個接口類,並無給出容器的具體實現,它經過不一樣的實現類,來定義或者擴充某個功能。
BeanFactory,從名字上也很好理解,生產管理bean的工廠(容器),它負責生產和管理各個bean實例。BeanFactory接口相關的主要繼承結構以下:編輯器

BeanFactory

BeanFactory是頂級接口,定義了Ioc容器最基本的形式。ui

public interface BeanFactory {

    //這裏能夠暫時不用管
    String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String name) throws BeansException;
    ... //省略其它方法
}

FACTORY_BEAN_PREFIX是用於與BeanFactory類似類~~~~FactoryBean的相關使用,後續會在Aop講。prototype

BeanFactory接口直系親屬

ListableBeanFactory

經過名字,這定義的是一個可列舉(迭代)的BeanFactory,經過這個BeanFactory能夠查找特定的Bean,相比頂級的BeanFactory,其查詢更加多樣化,牽涉到BeanDefinition,BeanName,註解等。code

public interface ListableBeanFactory extends BeanFactory {

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

    // 返回工廠的BeanDefinition總數
    int getBeanDefinitionCount();
    
    // 返回工廠中全部Bean的名字
    String[] getBeanDefinitionNames();

    // 返回對於指定類型 獲取bean的名字
    String[] getBeanNamesForType(ResolvableType type);
    
    //獲取包含某個註解 bean的名字
    String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);

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

}

HierarchicalBeanFactory

分層式的BeanFactory,這個工廠接口很是簡單,實現了Bean工廠的分層。相對於BeanFactory接口,它只擴展了一個重要的功能————工廠分層,能夠指定父工廠(容器),同時查找Bean的時候,能夠只查看本容器,忽略父容器。對象

public interface HierarchicalBeanFactory extends BeanFactory {

    BeanFactory getParentBeanFactory();

    /**
     * 返回本地bean工廠是否包含給定名稱的bean,
     * 忽略父容器上下文中定義的bean。
     * <p>這是{@code containsBean}的替代方法,
     * 忽略bean來自一個父容器工廠的名字。
     */
    boolean containsLocalBean(String name);

}

AutowireCapableBeanFactory

AutowireCapableBeanFactory目前尚未深刻的研究,這個Beanfactory增長了註解功能,能夠經過註解進行裝配(操做)的工廠(容器)。繼承

public interface AutowireCapableBeanFactory extends BeanFactory {

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

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

    //代表根據類型自動裝配
    int AUTOWIRE_BY_TYPE = 2;

    //代表根據構造方法裝配
    int AUTOWIRE_CONSTRUCTOR = 3;

    //被廢棄了
    @Deprecated
    int AUTOWIRE_AUTODETECT = 4;

    <T> T createBean(Class<T> beanClass) throws BeansException;

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

    ...//省略後續方法
}

BeanFactory高級接口

SingletonBeanRegistry

SingletoBeanRegistry接口主要實現了單例類註冊的功能。接口

public interface SingletonBeanRegistry {

    //註冊一個單例類  
    void registerSingleton(String beanName, Object singletonObject);


    Object getSingleton(String beanName);


    boolean containsSingleton(String beanName);


    String[] getSingletonNames();

    int getSingletonCount();

    //不清楚
    Object getSingletonMutex();

}

ConfigurableBeanFactory

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

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {

    String SCOPE_SINGLETON = "singleton";

    String SCOPE_PROTOTYPE = "prototype";
    
    //設置父容器
    void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;

    void setBeanClassLoader(ClassLoader beanClassLoader);

    ClassLoader getBeanClassLoader();

    void setBeanExpressionResolver(@Nullable 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();

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

    int getBeanPostProcessorCount();

    void registerScope(String scopeName, Scope scope);

    String[] getRegisteredScopeNames();

    Scope getRegisteredScope(String scopeName);

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

    BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

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

    void setCurrentlyInCreation(String beanName, boolean inCreation);

    boolean isCurrentlyInCreation(String beanName);

    void registerDependentBean(String beanName, String dependentBeanName);

    String[] getDependentBeans(String beanName);

    String[] getDependenciesForBean(String beanName);

    void destroyBean(String beanName, Object beanInstance);

    void destroyScopedBean(String beanName);

    void destroySingletons();
    
    ...//省略部分方法

}

ConfigurableListableBeanFactory

工廠接口ConfigrableListableBeanFactory同時繼承了3個接口,ListableBeanFactory、AutowireCapableBeanfactory,ConfigurableBeanFactory,功能已經很全面了。get

public interface ConfigurableListableBeanFactory
        extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {

    //忽略自動裝配的依賴類型
    void ignoreDependencyType(Class<?> type);
    
    //忽略自動裝配的接口
    void ignoreDependencyInterface(Class<?> ifc);

    //返回註冊的Bean定義
    BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;


    Iterator<String> getBeanNamesIterator();

    ...//忽略部分方法
}

總結

ListableBeanFactory(可列舉的容器(多花樣查詢)),HierarchicalBeanFactory(分層次容器,可有父容器),AutowireCapableBeanFactory(自動裝配容器),這三個容器定義了BeanFactory的基本面貌,在這個三個直系親屬下面又派生了兩個複雜的容器:ConfigurableBeanFactory,ConfigurableListableBeanFactory,可配置的(可操做)的容器,經過這兩個BeanFactory 可有修改容器中的bean,功能又更加高級了,集成了單例bean 服務,以及BeanDefinition 註冊服務,那麼對於 DefaultListableBeanFactory 來講,此時它就是一個可註冊,可配置,可獲取的BeanFactory ,就容器方面而言功能已經健全了。it

相關文章
相關標籤/搜索