【源碼】Spring —— BeanFactory 解讀 1 BeanFactory 系列接口
- 前言
- 版本
- BeanFactory
-
- HierarchicalBeanFactory
- ListableBeanFactory
- AutowireCapableBeanFactory
-
- ConfigurableBeanFactory
-
- ConfigurableListableBeanFactory
- 總結
前言
BeanFactory
,字面意思:
bean工廠
,事實上,我們擷取的
bean
就是由該接口的實作類生産,它維護所有的
bean
執行個體,并提供對應的方法
本章節羅列
BeanFactory
相關接口,從定義的方法認知整體接口
版本
Spring 5.3.x
BeanFactory
public interface BeanFactory {
/**
* 辨別擷取 FactoryBean 本身的字首 &
* 比如:getBean("&a") 是擷取 name = a
* 的 FactoryBean 本身
*/
String FACTORY_BEAN_PREFIX = "&";
/**
* 根據指定 name 擷取 bean
* 支援 别名檢索 | 父BeanFactory 檢索
* @param requiredType 指定 bean 的類型
* @param args 指定構造 bean 執行個體對應的參數,如果擷取到多個,會抛異常
*/
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
/**
* 略
*/
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
/**
* 目前 beanFactory 中是否存在指定 name 對應的 BeanDefinition
* 或者 單例執行個體
* 支援 别名檢索 | 父beanFactory 檢索
* 注意:傳回 true 并不意味着 getBean 可以擷取到對應的 bean
*/
boolean containsBean(String name);
/**
* 指定 name 的 bean 是否是 單例
* 不是 單例 也不意味着是 原型
* 支援 别名檢索 | 父beanFactory 檢索
*/
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
/**
* 指定 name 的 bean 是否原型,同 isSingleton
*/
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
/**
* 指定 name 對應的 bean 是否比對給定 ResolvableType
* 支援 别名檢索 | 父beanFactory
*/
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
/**
* 傳回指定 name 的 bean 的類型
* 如果是個 FactoryBean,則傳回的是它内部對象的類型,
* 但是如果内部類型沒有被提前暴露,則依據參數
* allowFactoryBeanInit 決定是否要提前初始化
* 目前 FactoryBean 以擷取内部類型
*/
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;
/**
* 傳回指定 beanName 的所有别名
* 如果指定的 beanName 也是一個别名,會傳回原始 name 和所有 别名
* 的數組(原始 name 在數組首位)
* 會同時在父 beanFactory 檢索
*/
String[] getAliases(String name);
}
- 定義擷取
本身的字首FactoryBean
&
- 定義一組
方法擷取getBean
執行個體,這種設計方法很通用,内部實作最終都會收口到一個方法上,對 調用者友好bean
- 值得一提的是,
方法傳回containsBean
并不意味這true
可以擷取對應的getBean
執行個體bean
- 上述檢索方法都支援
,同時也會去别名檢索
中檢索父BeanFactory
- 其他方法見注釋
HierarchicalBeanFactory
public interface HierarchicalBeanFactory extends BeanFactory {
// 傳回 父BeanFactory
@Nullable
BeanFactory getParentBeanFactory();
/**
* 跟 BeanFactory#containsBean 類似,該方法隻檢索
* 目前 BeanFactory,而不會去 父BeanFactory 檢索
* @param name
* @return
*/
boolean containsLocalBean(String name);
}
BeanFactory
的
子接口
:
- 提供了層級關系維護,
用于擷取getParentBeanFactory
父BeanFactory
-
不同于containsLocalBean
,隻會在目前層級中判斷是否存在指定BeanFactory#containsBean
的name
bean執行個體
ListableBeanFactory
public interface ListableBeanFactory extends BeanFactory {
/**
* 目前層級是否包含指定 beanName 對應的 BeanDefinition
*/
boolean containsBeanDefinition(String beanName);
// 傳回目前層級所有 BeanDefinition 個數
int getBeanDefinitionCount();
// 傳回目前層級所有 BeanDefinition 名稱數組
String[] getBeanDefinitionNames();
// 略
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType, boolean allowEagerInit);
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType, boolean allowEagerInit);
/**
* 擷取目前層級指定類型的 beanName 數組
* @param type
* @param includeNonSingletons 是否包括非單例
* @param allowEagerInit 是否需要初始化懶加載單例|FactoryBean
* @return
*/
String[] getBeanNamesForType(ResolvableType type);
String[] getBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit);
String[] getBeanNamesForType(@Nullable Class<?> type);
String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
/**
* 擷取目前層級指定類型的所有 bean 執行個體,name -> bean執行個體
* @param type
* @param includeNonSingletons 是否包括非單例
* @param allowEagerInit 是否需要初始化懶加載單例|FactoryBean
* @param <T>
* @return
* @throws BeansException
*/
<T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException;
<T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)
throws BeansException;
// 傳回标注了指定 注解 的 beanName 數組
String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);
// 傳回标注了指定 注解 的 bean示例集合:name -> bean執行個體
Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;
/**
* 依次從 指定bean 其父類 接口 和 工廠方法 上擷取指定注解
*/
@Nullable
<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
throws NoSuchBeanDefinitionException;
}
BeanFactory
的
子接口
:
- 拓展了
功能,提供了多重次元的枚舉
方法,詳情見注釋get
- 這些方法都僅限于目前層級的
,如果需要考慮父級,可以借助枚舉
BeanFactoryUtils
-
containsBeanDefinition
getBeanDefinitionCount
這幾個方法是完全基于目前getBeanDefinitionNames
中的BeanFactory
的,換句話說,對于我們通過BeanDefinition
等方法注冊的registerSingleton
執行個體,它們是不感覺的bean
-
getBeanNamesForType
方法是會感覺自行注冊getBeansOfType
執行個體的,當然大多數場景的bean
執行個體都是基于bean
掃描的BeanDefinition
-
getBeanDefinitionCount
基于性能問題不建議直接調用containsBeanDefinition
AutowireCapableBeanFactory
public interface AutowireCapableBeanFactory extends BeanFactory {
// 預設注入模式,也就是基于注解的注入
int AUTOWIRE_NO = 0;
// 基于 name 注入
int AUTOWIRE_BY_NAME = 1;
// 基于類型注入
int AUTOWIRE_BY_TYPE = 2;
// 推斷構造方法後注入
int AUTOWIRE_CONSTRUCTOR = 3;
// 自動檢測 @Deprecated
@Deprecated
int AUTOWIRE_AUTODETECT = 4;
// 通過此字尾擷取原始執行個體(比如 代理執行個體的 target)
String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL";
// 建立、填充 bean執行個體 相關方法
/**
* 建立指定類型的 bean執行個體:包括 執行個體建立、帶有注解屬性的注入、
* 各種初始化回調,還有 BeanPostProcessors 的執行
*/
<T> T createBean(Class<T> beanClass) throws BeansException;
/**
* 填充指定 bean執行個體:執行執行個體化後回調、屬性處理(注解注入)
* 本質上是為了給新執行個體 | 反序列化執行個體 (重新)填充注解注入的字段和方法
*/
void autowireBean(Object existingBean) throws BeansException;
/**
* 配置給定 bean執行個體:屬性注入、property values 應用、工廠回調執行、post processors 執行
*/
Object configureBean(Object existingBean, String beanName) throws BeansException;
// 更加細粒度控制 bean 生命周期的方法
/**
* 基于 autowireMode 建立 bean執行個體
*/
Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
/**
* 基于 autowireMode 執行個體化指定 bean執行個體
*/
Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
/**
* 基于 autowireMode 注入指定 bean執行個體 的屬性
*/
void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
throws BeansException;
/**
* 執行給定 beanName 對應 BeanDefinition 的 property values
*/
void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;
/**
* 初始化給定 bean:執行工廠回調、執行所有 post processors
*/
Object initializeBean(Object existingBean, String beanName) throws BeansException;
// 執行給定 bean執行個體 的所有 BeanPostProcessor#postProcessBeforeInitialization
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException;
// 執行給定 bean執行個體 的所有 BeanPostProcessor#postProcessAfterInitialization
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException;
// 銷毀指定 bean執行個體
void destroyBean(Object existingBean);
// 基于 name type 的依賴解析,可以了解為針對屬性擷取待注入的 bean執行個體
<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;
Object resolveBeanByName(String name, DependencyDescriptor descriptor) throws BeansException;
@Nullable
Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;
@Nullable
Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,
@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException;
}
BeanFactory
的
子接口
:
- 拓展了
能力自動裝配
- 它的能力被單獨拎出來,是以允許非
元件的執行個體也借助它來實作Spring
自動裝配
- 在
上下文中,可以通過ApplicationContext
擷取該執行個體,當然也可以擷取ApplicationContext#getAutowireCapableBeanFactor
進行類型轉換BeanFactory
- 它定義了不同的粒度生命周期的相關方法,詳細見注釋
ConfigurableBeanFactory
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry
HierarchicalBeanFactory
的子接口,拓展了配置能力,這是
Spring
常用的類設計模式,這一層抽象了所有
BeanFactory
類相關元件的配置,比如:
-
:BeanExpressionResolver
解析器SpEL
-
:轉換服務ConversionService
-
:支援添加PropertyEditorRegistrar
以注冊PropertyEditorRegistrar
PropertyEditor
-
:類型轉換的頂層接口,相當于整合了TypeConverter
和ConversionService
PropertyEditorRegistry
-
:支援添加StringValueResolver
來解析處理字元串StringValueResolver
-
:支援添加BeanPostProcessor
對BeanPostProcessor
進行後處理bean執行個體
- 另外還提供了諸如
getMergedBeanDefinition
等方法isFactoryBean
ConfigurableListableBeanFactory
public interface ConfigurableListableBeanFactory
extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory
集大成者,整合了所有接口的能力,并拓展了
getBeanDefinition
等方法
總結
-
,頂層接口,提供了最基礎的方法譬如BeanFactory
getBean
containsBean
-
,子接口,拓展了HierarchicalBeanFactory
層級關系
-
,子接口,拓展了ListableBeanFactory
枚舉能力
-
,子接口,拓展了AutowireCapableBeanFactory
能力自動裝配
-
,子接口,拓展了相關元件ConfigurableBeanFactory
的能力可配置化
-
,集大成者,直接實作類ConfigurableListableBeanFactory
DefaultListableBeanFactory
下一章節:【源碼】Spring —— BeanFactory 解讀 2 AbstractBeanFactory