前兩篇已經(jīng)簡介了Spring及其IoC容器,本篇介紹IoC容器最基礎(chǔ)的實(shí)現(xiàn)BeanFactory民逼,其XmlBeanFactory實(shí)現(xiàn)類將作為分析的入口(雖然該類已經(jīng)被標(biāo)記為過期,但是這不妨礙我們作為分析IoC的入口類
)稳懒,接下來很多的篇幅將以XmlBeanFactory為入口沃琅,對IoC容器進(jìn)行解析队寇。
BeanFactory簡介
IoC容器的頂級接口滋戳,是IoC容器的最基礎(chǔ)實(shí)現(xiàn)斋竞,也是訪問Spring容器的根接口倔约,負(fù)責(zé)對bean的創(chuàng)建,訪問等工作坝初。
接下來要介紹的類比較多浸剩,對于初看Spring源碼的同學(xué),只要知道BeanFactory的作用即可鳄袍。
類圖關(guān)系
- IDEA查看類圖-->光標(biāo)定位到類或接口-->右鍵

- XmlBeanFactory類圖結(jié)構(gòu)

藍(lán)色的實(shí)線表示類與類之間的繼承關(guān)系
綠色的實(shí)線表示接口與接口之間的繼承關(guān)系
綠色的虛線表示類與接口之間的繼承關(guān)系
XmlBeanFactory的繼承體系比較復(fù)雜,但是在分析源碼之間,了解一下類的繼承關(guān)系將助于我們對源碼的分析
從圖中可以看到,頂級接口分別是BeanFactory
,SingletonBeanRegistry
,AliasRegistry
1.BeanFactory
//SpringIoC容器頂級接口
public interface BeanFactory {
// 區(qū)分是獲取FactoryBean還是FactoryBean的createBean創(chuàng)建的實(shí)例.如果&開始則獲取FactoryBean;否則獲取createBean創(chuàng)建的實(shí)例.
String FACTORY_BEAN_PREFIX = "&";
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);
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}
1.1 ListableBeanFactory-->BeanFactory
//擴(kuò)展了BeanFactory接口,提供了對bean的枚舉能力,
//即可以返回bean的實(shí)例集合,而不用像BeanFactory只能返回單個bean的實(shí)例
//注意:如果存在父容器的話該接口不會考慮父容器中的bean,只會返回當(dāng)前容器中的bean
public interface ListableBeanFactory extends BeanFactory {
boolean containsBeanDefinition(String beanName);
int getBeanDefinitionCount();
String[] getBeanDefinitionNames();
String[] getBeanNamesForType(ResolvableType type);
String[] getBeanNamesForType(@Nullable Class<?> type);
String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
<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;
String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);
Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;
@Nullable
<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType) throws NoSuchBeanDefinitionException;
}
1.2 HierarchicalBeanFactory--> BeanFactory
//擴(kuò)展了BeanFactory接口,提供了對父容器的訪問功能
public interface HierarchicalBeanFactory extends BeanFactory {
@Nullable
BeanFactory getParentBeanFactory();
boolean containsLocalBean(String name);
}
1.3 AutowireCapableBeanFactory --> BeanFactory
//擴(kuò)展了BeanFactory绢要,主要提供了自動裝配能力
public interface AutowireCapableBeanFactory extends BeanFactory {
//無自動裝配
int AUTOWIRE_NO = 0;
//by-name裝配
int AUTOWIRE_BY_NAME = 1;
//by-type裝配
int AUTOWIRE_BY_TYPE = 2;
//constructor構(gòu)造函數(shù)裝配
int AUTOWIRE_CONSTRUCTOR = 3;
//自動裝配,已被標(biāo)記為過時
@Deprecated
int AUTOWIRE_AUTODETECT = 4;
//-------------------------------------------------------------------------
// 創(chuàng)建和填充外部bean實(shí)例的典型方法
//-------------------------------------------------------------------------
<T> T createBean(Class<T> beanClass) throws BeansException;
void autowireBean(Object existingBean) throws BeansException;
Object configureBean(Object existingBean, String beanName) throws BeansException;
//-------------------------------------------------------------------------
// 用于細(xì)粒度控制bean生命周期的方法
//-------------------------------------------------------------------------
Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck) throws BeansException;
void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;
Object initializeBean(Object existingBean, String beanName) throws BeansException;
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException;
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException;
void destroyBean(Object existingBean);
//-------------------------------------------------------------------------
// 委托方法解決注入點(diǎn)
//-------------------------------------------------------------------------
<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) 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;
}
ListableBeanFactory,HierarchicalBeanFactory,AutowireCapableBeanFactory是BeanFactory的直接子接口,分別提供了對bean的枚舉能力,對父容器的訪問能力,對bean的自動裝配能力
1.4 ConfigurableBeanFactory--> HierarchicalBeanFactory-->BeanFactory
//擴(kuò)展了HierarchicalBeanFactory,SingletonBeanRegistry,主要提供了對BeanFactory的配置能力
//該接口擴(kuò)展的內(nèi)容較多,比如類加載器,類型轉(zhuǎn)化,屬性編輯器,BeanPostProcessor,
//作用域,bean定義,處理bean依賴關(guān)系,合并其他ConfigurableBeanFactory,bean如何銷毀等
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
標(biāo)準(zhǔn)單例范圍的范圍標(biāo)識符:“singleton”拗小。
String SCOPE_SINGLETON = "singleton";
//標(biāo)準(zhǔn)原型范圍的范圍標(biāo)識符:“prototype”重罪。
String SCOPE_PROTOTYPE = "prototype";
//設(shè)置父工廠,注意:不能更改父級工廠
void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
//設(shè)置類加載器以用于加載bean類。默認(rèn)是線程上下文類加載器。
void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);
//返回該工廠的類加載器
@Nullable
ClassLoader getBeanClassLoader();
//指定用于類型匹配目的的臨時ClassLoader剿配。
void setTempClassLoader(@Nullable ClassLoader tempClassLoader);
//獲取用于類型匹配目的的臨時ClassLoader搅幅。
@Nullable
ClassLoader getTempClassLoader();
//設(shè)置是否緩存bean元數(shù)據(jù),例如給定的bean定義(以合并方式)和已解析的bean類呼胚。默認(rèn)打開茄唐。
//關(guān)閉此標(biāo)志以啟用bean定義對象的熱刷新,特別是bean類蝇更。如果此標(biāo)志關(guān)閉沪编,則任何bean實(shí)例的創(chuàng)建都將為新解析的類重新查詢bean類加載器。
void setCacheBeanMetadata(boolean cacheBeanMetadata);
//返回是否緩存bean元數(shù)據(jù)
boolean isCacheBeanMetadata();
//為bean定義值中的表達(dá)式指定解析策略簿寂。
//默認(rèn)情況下漾抬,BeanFactory中沒有活動表達(dá)式支持。ApplicationContext通常會在此處設(shè)置標(biāo)準(zhǔn)表達(dá)式策略常遂,支持Unified EL兼容樣式中的“#{...}”表達(dá)式纳令。
void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver);
//返回bean定義值中表達(dá)式的解析策略。
@Nullable
BeanExpressionResolver getBeanExpressionResolver();
//指定用于轉(zhuǎn)換屬性值的Spring 3.0 ConversionService克胳,作為JavaBeans PropertyEditors的替代方法平绩。
void setConversionService(@Nullable ConversionService conversionService);
//返回關(guān)聯(lián)的ConversionService(如果有)。
@Nullable
ConversionService getConversionService();
//添加PropertyEditorRegistrar以應(yīng)用于所有bean創(chuàng)建過程漠另。
void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
//為給定類型的所有屬性注冊給定的自定義屬性編輯器捏雌。在工廠配置期間調(diào)用。
void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);
//使用已在此BeanFactory中注冊的自定義編輯器初始化給定的PropertyEditorRegistry笆搓。
void copyRegisteredEditorsTo(PropertyEditorRegistry registry);
//設(shè)置此BeanFactory應(yīng)用于轉(zhuǎn)換bean屬性值性湿,構(gòu)造函數(shù)參數(shù)值等的自定義類型轉(zhuǎn)換器。
//這將覆蓋默認(rèn)的PropertyEditor機(jī)制满败,因此使任何自定義編輯器或自定義編輯器注冊表都無關(guān)緊要肤频。
void setTypeConverter(TypeConverter typeConverter);
//獲取此BeanFactory使用的類型轉(zhuǎn)換器。這可能是每次調(diào)用的新實(shí)例算墨,因?yàn)門ypeConverters通常不是線程安全的宵荒。
//如果默認(rèn)的PropertyEditor機(jī)制處于活動狀態(tài),則返回的TypeConverter將知道已注冊的所有自定義編輯器净嘀。
TypeConverter getTypeConverter();
//為嵌入值(例如注釋屬性)添加String解析器报咳。
void addEmbeddedValueResolver(StringValueResolver valueResolver);
//確定是否已通過此Bean工廠注冊了嵌入值解析程序resolveEmbeddedValue(String)。
boolean hasEmbeddedValueResolver();
//解析給定的嵌入值挖藏,例如注釋屬性暑刃。
@Nullable
String resolveEmbeddedValue(String value);
//添加一個新的BeanPostProcessor,它將應(yīng)用于此工廠創(chuàng)建的bean膜眠。在工廠配置期間調(diào)用岩臣。
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
//返回已注冊的BeanPostProcessors的當(dāng)前數(shù)量(如果有)袁翁。
int getBeanPostProcessorCount();
//注冊給定范圍,由給定的Scope實(shí)現(xiàn)支持婿脸。
void registerScope(String scopeName, Scope scope);
//返回所有當(dāng)前注冊的范圍的名稱。
String[] getRegisteredScopeNames();
//返回給定范圍名稱的Scope實(shí)現(xiàn)(如果有)柄驻。
@Nullable
Scope getRegisteredScope(String scopeName);
//提供與此工廠相關(guān)的安全訪問控制上下文狐树。
AccessControlContext getAccessControlContext();
//復(fù)制給定其他工廠的所有相關(guān)配置。
//應(yīng)包括所有標(biāo)準(zhǔn)配置設(shè)置以及BeanPostProcessors鸿脓,Scopes和工廠特定的內(nèi)部設(shè)置抑钟。不應(yīng)包含實(shí)際bean定義的任何元數(shù)據(jù),例如BeanDefinition對象和bean名稱別名野哭。
void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);
//給定bean名稱在塔,創(chuàng)建別名。
void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;
//解析在此工廠中注冊的所有別名目標(biāo)名稱和別名拨黔,將給定的StringValueResolver應(yīng)用于它們蛔溃。
//例如,值解析器可以解析目標(biāo)bean名稱中的占位符篱蝇,甚至可以解析別名中的占位符贺待。
void resolveAliases(StringValueResolver valueResolver);
//返回給定bean名稱的合并BeanDefinition,如果需要零截,將子bean定義與其父bean合并麸塞。也考慮祖先工廠中的bean定義。
BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
//確定具有給定名稱的bean是否為FactoryBean涧衙。
boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;
//顯式控制指定bean的當(dāng)前創(chuàng)建狀態(tài)哪工。僅限容器內(nèi)部使用。
void setCurrentlyInCreation(String beanName, boolean inCreation);
//確定指定的bean當(dāng)前是否正在創(chuàng)建弧哎。
boolean isCurrentlyInCreation(String beanName);
//為給定的bean注冊一個依賴bean雁比,在銷毀給定bean之前銷毀它。
void registerDependentBean(String beanName, String dependentBeanName);
//返回依賴于指定bean的所有bean的名稱(如果有)傻铣。
String[] getDependentBeans(String beanName);
//返回指定bean所依賴的所有bean的名稱(如果有)章贞。
String[] getDependenciesForBean(String beanName);
//根據(jù)bean的定義,銷毀給定的bean實(shí)例(通常是從這個工廠獲得的原型實(shí)例)非洲。
void destroyBean(String beanName, Object beanInstance);
//銷毀當(dāng)前目標(biāo)作用域中指定的作用域bean(如果有)鸭限。
void destroyScopedBean(String beanName);
銷毀此工廠中的所有單例bean,包括已注冊為一次性的內(nèi)部bean两踏。
void destroySingletons();
}
1.5 ConfigurableListableBeanFactory
ConfigurableListableBeanFactory--> ListableBeanFactory-->BeanFactory
ConfigurableListableBeanFactory--> AutowireCapableBeanFactory-->BeanFactory
ConfigurableListableBeanFactory--> ConfigurableBeanFactory-->HierarchicalBeanFactory-->BeanFactory
ConfigurableListableBeanFactory繼承了三個接口,并擴(kuò)展了忽略依賴,自動裝配判斷,凍結(jié)bean的定義,枚舉所有bean名稱的功能
public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
//忽略給定的自動裝配依賴關(guān)系接口败京。
void ignoreDependencyType(Class<?> type);
//忽略給定的自動裝配依賴關(guān)系接口。
void ignoreDependencyInterface(Class<?> ifc);
//使用相應(yīng)的自動裝配值注冊特殊依賴關(guān)系類型梦染。
void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue);
//確定指定的bean是否有資格作為autowire候選者赡麦,注入到聲明匹配類型依賴關(guān)系的其他bean中朴皆。
boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException;
//返回指定bean的已注冊BeanDefinition,允許訪問其屬性值和構(gòu)造函數(shù)參數(shù)值(可以在bean工廠后處理期間修改)泛粹。
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
//返回所有bean名稱的迭代對象
Iterator<String> getBeanNamesIterator();
//清除合并的bean定義緩存遂铡,刪除尚未被認(rèn)為有資格進(jìn)行完整元數(shù)據(jù)緩存的bean條目。
void clearMetadataCache();
//凍結(jié)所有bean定義晶姊,表明注冊的bean定義不會被修改或進(jìn)一步后處理扒接。
void freezeConfiguration();
//返回是否凍結(jié)此工廠的bean定義
boolean isConfigurationFrozen();
//確保所有非lazy-init單例都被實(shí)例化
void preInstantiateSingletons() throws BeansException;
}
1.6 BeanFactory總結(jié)
分析了從BeanFactory到ConfigurableListableBeanFactory接口的概要功能
- BeanFactory-->
SpringIoC容器頂級接口,定義了對單個bean的獲取,對bean的作用域判斷,獲取bean類型,獲取bean別名的功能
- ListableBeanFactory-->
擴(kuò)展了BeanFactory接口,并提供了對bean的枚舉能力
- HierarchicalBeanFactory-->
擴(kuò)展了BeanFactory接口,并提供了訪問父容器的能力
- AutowireCapableBeanFactory-->
擴(kuò)展了BeanFactory接口,并提供了自動裝配能力
- ConfigurableBeanFactory-->
擴(kuò)展了HierarchicalBeanFactory,并提供了對容器的配置能力
- ConfigurableListableBeanFactory-->
擴(kuò)展了ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory接口,并提供了忽略依賴,自動裝配判斷,凍結(jié)bean的定義,枚舉所有bean名稱的功能
以上介紹BeanFactory接口的分支,下面介紹AliasRegistry接口的分支,該分支下大部分都是實(shí)現(xiàn)類,代碼較多,也較為復(fù)雜,其中細(xì)節(jié),留在以后分析,下面只說下類的主要作用
2. AliasRegistry接口及其實(shí)現(xiàn)類簡介
- AliasRegistry-->定義bean的別名管理
- SimpleAliasRegistry-->實(shí)現(xiàn)別名管理接口
- SingletonBeanRegistry-->提供單例注冊,查詢服務(wù)
- DefaultSingletonBeanRegistry-->實(shí)現(xiàn)單例與DisposableBean的生命周期管理(創(chuàng)建,維護(hù),銷毀)
- FactoryBeanRegistrySupport-->添加工廠方式創(chuàng)建類FactoryBean的支持
本篇主要從概念和功能上讓大家對BeanFactory有所了解,接下來幾篇介紹IoC容器的初始化及bean的獲取