天天看點

【源碼】Spring —— BeanFactory 解讀 1 BeanFactory 系列接口前言版本BeanFactory總結

【源碼】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

繼續閱讀