注:本文所有的源碼對應spring jar version爲4.2.4
類圖
相關類介紹
- 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:
/**
* 定義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);
}
看完三個基本的父類之後,我們依次往下看相關的源碼。考慮到後面的源碼量比較大,我會在後文中給出具體的源碼分析。