9.Spring源碼之路-DefaulListableBeanFactory - ConfigurableBeanFactory

Spring源碼之路-DefaulListableBeanFactory

總結

  1. 此接口的方法看起來比較多,主要是提供給框架設計者使用的
  2. 此接口基於支持父子關係的BeanFactory,同時支持單例Bean的註冊接口
    主要是用於配置時需要的功能。
  3. 有一個方法void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);主要是添加Bean的後置處理器,用於在Bean初始化前後對Bean進行一些特殊的處理
  4. 指定了默認的兩個作用域 singletonprototype,如果需要其他的作用域可以通過void registerScope(String scopeName, Scope scope);方法來進行註冊新的作用域範圍

源碼註釋的大概翻譯

/**
 * 由大多數bean工廠實現的配置接口. 
 * 除了{@link org.springframework.beans.factory.BeanFactory} 接口中的bean工廠
 * 客戶端方法之外,還提供了配置bean工廠的設施。 
 *
 * 此bean工廠接口不適合在常規應用程序中使用
 * 代碼:堅持使用{@link org.springframework.beans.factory.BeanFactory}或
 * {@link org.springframework.beans.factory.ListableBeanFactory }用於典型的
 * 需求。此擴展接口僅用於允許框架內部即插即用,並允許對bean工廠配置方
 * 法的特殊訪問。 
 *
 * @author Juergen Hoeller
 * @since 03.11.2003
 * @see org.springframework.beans.factory.BeanFactory
 * @see org.springframework.beans.factory.ListableBeanFactory
 * @see ConfigurableListableBeanFactory
 */
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {

	/**
	 * 標準單例作用域的作用域標識符:{@value}。 
	 * 可以通過{@code registerScope}添加自定義範圍。 
	 * @see #registerScope
	 */
	String SCOPE_SINGLETON = "singleton";

	/**
	 * 標準原型範圍的範圍標識符:{@ value}。 
	 * 可以通過{@code registerScope}添加自定義範圍。 
	 * @see #registerScope
	 */
	String SCOPE_PROTOTYPE = "prototype";


	/**
	 * 設置此beanFactory的父級。
	 * 請注意,父級不能更改:如果在工廠實例化時不可用,則只能在
	 * 構造函數外部設置。 
	 * @param parentBeanFactory 父BeanFactory 
	 * @throws IllegalStateException 如果此工廠已經與父BeanFactory關聯
	 * @see #getParentBeanFactory()
	 */
	void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;

	/**
	 * 設置用於加載Bean類的類加載器。 
	 * 默認爲線程上下文類加載器。 
	 * 請注意,此類加載器僅適用於尚不包含已解析的bean類的bean定義。
	 * 在默認情況下,從Spring 2.0開始就是這種情況:Bean定義僅帶有Bean類名,
	 * 在工廠處理Bean定義後即可解決。 
	 * @param beanClassLoader 要使用的類加載器,或{@code null}建議默認的類加載器
	 */
	void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);

	/**
	 * 返回此工廠的類加載器以加載Bean類
	 * (即使無法訪問系統ClassLoader,也僅{@code null})。 
	 * @see org.springframework.util.ClassUtils#forName(String, ClassLoader)
	 */
	@Nullable
	ClassLoader getBeanClassLoader();

	/**
	 * 指定用於類型匹配目的的臨時ClassLoader。 
	 * 默認爲無,只需使用標準bean ClassLoader。 
	 * 如果涉及到加載時編織,通常僅指定一個臨時的ClassLoader,
	 * 以確保儘可能延遲地加載實際的bean類。 
	 * 一旦BeanFactory完成其引導階段,便將臨時加載器刪除。 
	 * @since 2.5
	 */
	void setTempClassLoader(@Nullable ClassLoader tempClassLoader);

	/**
	 * 如果有的話,返回臨時ClassLoader以用於類型匹配。
	 * @since 2.5
	 */
	@Nullable
	ClassLoader getTempClassLoader();

	/**
	 * 設置是否緩存bean元數據,例如給定的BeanDefinition
	 * (以合併方式)和已解析的bean類。默認爲開。 
	 * 關閉此標誌以啓用BeanDefinition對象(特別是Bean Class)的熱刷新。
	 * 如果關閉此標誌,則任何bean實例的創建都將重新查詢bean類加載器
	 * 以獲取新解析的類。
	 */
	void setCacheBeanMetadata(boolean cacheBeanMetadata);

	/**
	 * 返回是否緩存Bean元數據,例如給定的Bean定義(以合併方式)
	 * 和已解析的Bean Class。 
	 */
	boolean isCacheBeanMetadata();

	/**
	 * 爲bean定義值中的表達式指定解析策略。 
	 * 默認情況下,BeanFactory中不支持任何表達式支持。 
	 * ApplicationContext通常會在此處設置標準的表達式策略
	 * 以統一EL兼容樣式支持“#{...}”表達式。 
	 * @since 3.0
	 */
	void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver);

	/**
	 * 返回bean定義值中表達式的解析策略。
	 * @since 3.0
	 */
	@Nullable
	BeanExpressionResolver getBeanExpressionResolver();

	/**
	 * 指定一個ConversionService用於轉換屬性值,以替代JavaBeans PropertyEditors。 
	 * @since 3.0
	 */
	void setConversionService(@Nullable ConversionService conversionService);

	/**
	 * 如果有,返回關聯的ConversionService。
	 * @since 3.0
	 */
	@Nullable
	ConversionService getConversionService();

	/**
	 * 添加一個PropertyEditorRegistrar應用於所有bean創建過程。 
	 * 這樣的註冊服務商會創建新的PropertyEditor實例,並在給定的註冊表中註冊它們,
	 * 對於每次創建bean的嘗試都是新鮮的。這避免了在定製編輯器上進行同步的需要;
	 * 因此,通常最好使用此方法代替{@link #registerCustomEditor}。 
	 * @param registrar 被添加的PropertyEditorRegistrar對象
	 */
	void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);

	/**
	 * 爲給定類型的所有屬性註冊給定的定製屬性編輯器。在出廠配置期間調用。 
	 * 請注意,此方法將註冊一個共享的自定義編輯器實例; 
	 * 爲了線程安全,對該實例的訪問將被同步。 
	 * 通常最好使用{@link #addPropertyEditorRegistrar}代替
	 * 此方法,以避免需要在自定義編輯器上進行同步。 
	 * @param requiredType 屬性的類型
	 * @param propertyEditorClass 要註冊的{@link PropertyEditor}類
	 */
	void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);

	/**
	 * 使用已在此BeanFactory中註冊的自定義編輯器
	 * t初始化給定的PropertyEditorRegistry。 
	 * @param registry 使用PropertyEditorRegistry來初始化
	 */
	void copyRegisteredEditorsTo(PropertyEditorRegistry registry);

	/**
	 * 設置此BeanFactory用於轉換bean屬性值,構造函數參數值等的自定義類型轉換器。
	 * 這將覆蓋默認的PropertyEditor機制,因此使任何自定義編輯器或自定義編輯器註冊
	 * 器均不起作用。 
	 * @since 2.5
	 * @see #addPropertyEditorRegistrar
	 * @see #registerCustomEditor
	 */
	void setTypeConverter(TypeConverter typeConverter);

	/**
	 * 獲取此BeanFactory使用的類型轉換器。這可能是新的
	 * 實例,因爲TypeConverters通常不是線程安全的。 
	 * 如果默認的PropertyEditor機制處於活動狀態,則返回的TypeConverter將知道已
	 * 註冊的所有自定義編輯器。 
	 * @since 2.5
	 */
	TypeConverter getTypeConverter();

	/**
	 * 爲嵌入的值(例如註釋屬性)添加字符串解析器。
	 * @param valueResolver 字符串解析器應用於嵌入值
	 * @since 3.0
	 */
	void addEmbeddedValueResolver(StringValueResolver valueResolver);

	/**
	 * 確定是否已通過{@link #resolveEmbeddedValue(String)}
	 * 應用此bean工廠註冊了嵌入式值解析器。 
	 * @since 4.3
	 */
	boolean hasEmbeddedValueResolver();

	/**
	 * 解析給定的嵌入值,例如註釋屬性。
	 * @param value 要解析的值
	 * @return 返回解析的值(可能是原始值)
	 * @since 3.0
	 */
	@Nullable
	String resolveEmbeddedValue(String value);

	/**
	 * 添加一個新的BeanPostProcessor,它將應用於該工廠創建的bean。
	 * 在出廠配置期間調用。 注意:此處提交的後處理器將按照註冊的順序應用;
	 * 通過實現{@link org.springframework.core.Ordered}接口表示的任何排序語義
	 * 都將被忽略。請注意自動檢測到的後處理器(例如,作爲ApplicationContext
	 * 中的bean)將始終以編程方式註冊後的處理器。 
	 * @param beanPostProcessor 用於註冊後處理器
	 */
	void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

	/**
	 * 如果有,返回當前已註冊的BeanPostProcessor的數量。
	 */
	int getBeanPostProcessorCount();

	/**
	 * 註冊由給定範圍實現支持的給定範圍。 
	 * @param scopeName 範圍標識符
	 * @param scope 支持的Scope實現
	 */
	void registerScope(String scopeName, Scope scope);

	/**
	 * 返回所有當前註冊範圍的名稱。 
	 * 這將僅返回顯式註冊的作用域的名稱。 
	 * 內置作用域(例如“ singleton”和“ prototype”)不會公開。 
	 * @return 返回作用域名稱的數組,如果沒有則返回空數組
	 * @see #registerScope
	 */
	String[] getRegisteredScopeNames();

	/**
	 * 如果有,返回給定作用域名稱的作用域實現。 
	 * 這將僅返回顯式註冊的範圍。 
	 * 內置作用域(例如“ singleton”和“ prototype”)不會公開。 
	 * @param scopeName 作用域的名稱
	 * @return 返回註冊的作用域實現,如果沒有則返回{@code null} 
	 * @see #registerScope
	 */
	@Nullable
	Scope getRegisteredScope(String scopeName);

	/**
	 * 提供與此工廠有關的安全訪問控制上下文。 
	 * @return 返回適用的AccessControlContext(從不{@code null})
	 * @since 3.0
	 */
	AccessControlContext getAccessControlContext();

	/**
	 * 從給定的其他工廠複製所有相關配置。 
	 * 應包括所有標準配置設置以及BeanPostProcessor,範圍和工廠特定的內部設置。 
	 * 不應包含任何實際bean定義的元數據,例如BeanDefinition對象和bean名稱別名。 
	 * @param otherFactory 要從複製的另一個BeanFactory
	 */
	void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);

	/**
	 * 給定一個bean名稱,創建一個別名。我們通常使用此方法
	 * 支持XML ID(用於bean名稱)中非法的名稱。 
	 * 通常在出廠配置期間調用,但也可以用於別名的運行時註冊。因此,factory 
	 * 實現應同步別名訪問。 
	 * @param beanName 目標bean的規範名稱
	 * @param alias 是要爲該bean註冊的別名
	 * @throws BeanDefinitionStoreException 如果別名已經在使用中
	 */
	void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;

	/**
	 * 解析所有別名目標名稱和在該工廠中註冊的別名,
	 * 將給定的StringValueResolver應用於它們。 
	 * 例如,值解析器可以解析目標bean名稱甚至別名中的佔位符
	 * @param valueResolver 要應用的StringValueResolver 
	 * @since 2.5
	 */
	void resolveAliases(StringValueResolver valueResolver);

	/**
	 * 返回給定bean名稱的合併BeanDefinition,
	 * 如有必要,將子bean定義與其父級合併。 
	 * 還要考慮祖先工廠中的bean定義。 
	 * @param beanName 要檢索給定bean的合併定義的bean的名稱
	 * @return 返回給定bean的(可能合併的)BeanDefinition 
	 * @throws NoSuchBeanDefinitionException 如果沒有給定名稱的bean定義
	 * @since 2.5
	 */
	BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	/**
	 * 確定具有給定名稱的Bean是否爲FactoryBean。 
	 * @param name 要檢查的bean的名稱
	 * @return 返回bean是否爲FactoryBean 
	 *({@ code false}表示該bean存在,但不是FactoryBean)
	 * @throws NoSuchBeanDefinitionException 如果沒有給定名稱的bean
	 * @since 2.5
	 */
	boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 明確控制指定bean的當前增量狀態。 僅供容器內部使用。 
	 * @param beanName Bean的名稱
	 * @param inCreation 是否當前正在創建該bean 
	 * @since 3.1
	 */
	void setCurrentlyInCreation(String beanName, boolean inCreation);

	/**
	 * 確定當前是否正在創建指定的bean。 
	 * @param beanName bean的名稱
	 * @return 返回當前是否正在創建bean
	 * @since 2.5
	 */
	boolean isCurrentlyInCreation(String beanName);

	/**
	 * 爲給定的bean註冊一個依賴的bean,
	 * 在給定的bean被銷燬之前被銷燬。 
	 * @param beanName bean的名稱
	 * @param dependentBeanName 依賴的bean的名稱
	 * @since 2.5
	 */
	void registerDependentBean(String beanName, String dependentBeanName);

	/**
	 * 返回依賴於指定bean的所有bean的名稱(如果有)。 
	 * @param beanName bean的名稱
	 * @return 返回相關bean名稱的數組,如果沒有則返回一個空數組
	 * @since 2.5
	 */
	String[] getDependentBeans(String beanName);

	/**
	 * 返回指定bean所依賴的所有bean的名稱(如果有)。  
	 * @param beanName bean的名稱
	 * @return 返回bean所依賴的bean的名稱數組,或如果沒有則返回一個空數組
	 * or an empty array if none
	 * @since 2.5
	 */
	String[] getDependenciesForBean(String beanName);

	/**
	 * 根據其bean定義銷燬給定的bean實例(通常是從該工廠獲得的原型實例)。 
	 * 應該捕獲並銷燬在銷燬過程中出現的任何異常,而不是傳播給此方法的調用者。 
	 * @param beanName bean定義的名稱
	 * @param beanInstance 要銷燬的bean實例
	 */
	void destroyBean(String beanName, Object beanInstance);

	/**
	 * 銷燬當前目標範圍中的指定範圍的bean(如果有)。 
	 * 應該捕獲並銷燬在銷燬過程中出現的任何異常,而不是傳播給此方法的調用者。 
	 * @param beanName 作用域bean的名稱
	 */
	void destroyScopedBean(String beanName);

	/**
	 * 銷燬該工廠中的所有單例Bean,包括已註冊爲一次性的inner Bean。
	 * 在工廠關閉時被調用。 
	 * 應該捕獲並銷燬在銷燬過程中出現的任何異常,而不是傳播給此方法的調用者。 
	 */
	void destroySingletons();

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