Spring源碼閱讀之DefaultListableBeanFactory

注:本文所有的源碼對應spring jar version爲4.2.4

類圖

開篇先給出DefaultListableBeanFactory類圖,本篇將根據類圖的繼承關係從上往下依次分析。

相關類介紹

  • AliasRegistry:定義alias相關的簡單的增刪改查等操作;
  • SimpleAliasRegistry:實現接口AliasRegistry,使用map做alias的緩存;
  • SingletonBeanRegistry:定義單例的註冊及獲取;
  • BeanFactory:定義獲取bean及bean的各種特性;
  • DefaultSingletonBeanRegistry:實現接口SingletonBeanRegistry;
  • HierarchicalBeanFactory:繼承BeanFatory,並且在BeanFactory定義的功能的基礎上增加了對parentFactory的支持;
  • BeanDefinitionRegistry:定義對BeanDefinition的增刪改等操作;
  • FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基礎上增加了對FactoryBean的特殊處理功能;
  • ConfigurableBeanFactory:提供配置Factory的各種方法;
  • ListableBeanFactory:根據各種條件獲取bean的配置清單;
  • AbstractBeanFactory:綜合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能;
  • AutowireCapableBeanFactory:提供bean的創建、自動注入、初始化和應用bean的後處理器;
  • AbstractAutowireCapableBeanFactory:綜合AbstractBeanFactory並實現接口AutowireCapableBeanFactory;
  • ConfigurableListableBeanFactory:BeanFactory配置清單;
  • DefaultListableBeanFactory:綜合上面所有的功能,對bean做處理後的註冊。

具體源碼分析

根據類圖發現AliasRegistry、SingletonBeanRegistry、BeanFactory這三個類是最上層的父類,我們就先從這三個類開始分析。

AliasRegistry:

先上源碼:
/**
 * 定義bean別名相關操作
 */
public interface AliasRegistry {

    /**
     * 給該name的bean定義一個別名
     * @param name bean的name
     * @param alias 別名
     * @throws IllegalStateException 別名已經存在或者不能被繼承的bean拋出該異常
     */
    void registerAlias(String name, String alias);

    /**
     * 移除指定的別名
     * @param alias 需要移除的別名
     * @throws IllegalStateException 別名不存在是拋出該異常
     */
    void removeAlias(String alias);

    /**
     * 判斷name是否是已經註冊的別名
     * @param name
     * @return true/false
     */
    boolean isAlias(String name);

    /**
     * 返回該name註冊的所有的別名
     * @param name
     * @return
     */
    String[] getAliases(String name);
}
具體的註釋在代碼中已經詳細給出,具體的其他的講解在此不做贅述。

SingletonBeanRegistry:

源碼:
/**
 * 定義對單例的註冊及獲取
 */
public interface SingletonBeanRegistry {

    /**
     * 單例註冊
     * @param beanName
     * @param singletonObject
     */
    void registerSingleton(String beanName, Object singletonObject);

    /**
     * 根據beanName獲取單例
     * @param beanName
     * @return
     */
    Object getSingleton(String beanName);

    /**
     * 判斷該bean是否已經有註冊的單例
     * @param beanName
     * @return
     */
    boolean containsSingleton(String beanName);

    /**
     * 獲取所有已註冊單例的bean的name
     * @return
     */
    String[] getSingletonNames();

    /**
     * 計算已註冊的單例數量
     * @return
     */
    int getSingletonCount();

    /**
     * return the singleton mutex used by this registry
     * @return
     */
    Object getSingletonMutex();
}

BeanFactory:

源碼:
/**
 * 定義獲取bean以及bean的相關屬性
 */
public interface BeanFactory {

    /**
     * 標識符,用以區分是否是由FactoryBean創建
     */
    String FACTORY_BEAN_PREFIX = "&";

    /**
     * 根據name返回該類的一個實例
     * @param name bean的name
     * @return 類的實例
     * @throws BeansException 沒有該類的時候拋出該異常
     */
    Object getBean(String name) throws BeansException;

    /**
     * 根據name返回一個指定類型的實例
     * @param name bean的name
     * @param requiredType 指定的類型
     * @param <T>
     * @return 類的指定類型實例
     * @throws NoSuchBeanDefinitionException 沒有該類的定義的時候拋出該異常
     * @throws BeanNotOfRequiredTypeException 該類沒有指定的類型時拋出該異常
     * @throws BeansException 類不能被創建的時候拋出該異常
     */
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;

    /**
     * 返回符合指定類型的類的實例
     * @param requiredType 指定類型
     * @param <T>
     * @return 指定類型的類的實例
     * @throws NoSuchBeanDefinitionException 沒有符合該類型的類的定義時拋出該異常
     * @throws NoUniqueBeanDefinitionException 符合該類型的類超過一個時拋出該異常
     * @throws BeansException 類不能被創建的時候拋出該異常
     */
    <T> T getBean(Class<T> requiredType) throws BeansException;

    /**
     * 根據name返回該類的一個實例
     * @param name bean的name
     * @param args 創建實例需要的參數
     * @return 類的實例
     * @throws NoSuchBeanDefinitionException 沒有該類的定義時拋出該異常
     * @throws BeanDefinitionStoreException
     * @throws BeansException 類不能被創建的時候拋出該異常
     */
    Object getBean(String name, Object... args) throws BeansException;

    /**
     * 返回符合指定類型的類的實例
     * @param requiredType 指定類型
     * @param args 創建實例需要的參數
     * @param <T>
     * @return 類的實例
     * @throws NoSuchBeanDefinitionException 沒有符合該類型的類的定義時拋出該異常
     * @throws BeanDefinitionStoreException
     * @throws BeansException 類不能被創建的時候拋出該異常
     */
    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

    /**
     * 判斷factory中是否包含指定name的bean的定義或者是否已經註冊了單例
     * @param name
     * @return
     */
    boolean containsBean(String name);

    /**
     * 判斷該name的bean是否是單例
     * @param name bean的name
     * @return
     * @throws NoSuchBeanDefinitionException 該name沒有相應的bean的時候拋出該異常
     */
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

    /**
     * 判斷該name的bean是否是java prototype
     * @param name
     * @return
     * @throws NoSuchBeanDefinitionException 該name沒有相應的bean的時候拋出該異常
     */
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

    /**
     * 判斷是否存在符合特殊類型的bean
     * @param name bean的name
     * @param typeToMatch 符合的特殊類型type
     * @return
     * @throws NoSuchBeanDefinitionException 該name沒有相應的bean的時候拋出該異常
     */
    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

    /**
     * 判斷是否存在符合指定類型的bean
     * @param name bean的name
     * @param typeToMatch 指定類型type
     * @return
     * @throws NoSuchBeanDefinitionException 該name沒有相應的bean的時候拋出該異常
     */
    boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

    /**
     * 返回該name的bean的類型
     * @param name bean的name
     * @return bean的類型
     * @throws NoSuchBeanDefinitionException 該name沒有相應的bean的時候拋出該異常
     */
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;

    /**
     * 返回該name的bean的所有的別名
     * @param name bean的name
     * @return 該bean的別名
     */
    String[] getAliases(String name);
}

看完三個基本的父類之後,我們依次往下看相關的源碼。考慮到後面的源碼量比較大,我會在後文中給出具體的源碼分析。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章