Spring源碼之路-DefaulListableBeanFactory
總結
- 此接口的方法看起來比較多,主要是提供給框架設計者使用的
- 此接口基於支持父子關係的BeanFactory,同時支持單例Bean的註冊接口
主要是用於配置時需要的功能。
- 有一個方法
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
主要是添加Bean的後置處理器,用於在Bean初始化前後對Bean進行一些特殊的處理
- 指定了默認的兩個作用域
singleton
和prototype
,如果需要其他的作用域可以通過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();
}