不知道爲何看着Spring的源碼,感觸最深的是Spring對概念的抽象,因此我就先學接口了.設計模式
BeanFactory是Spring IOC實現的基礎,這邊定義了一系列的接口,咱們經過這些接口的學習,能夠大體瞭解BeanFactory體系各接口如何分工合做.api
爲學習具體實現打下基礎.畢竟這邊邏輯複雜,涉及的概念不少.緩存
BeanFactory 是Spring bean容器的根接口.提供獲取bean,是否包含bean,是否單例與原型,獲取bean類型,bean 別名的api.mvc
-- AutowireCapableBeanFactory 添加集成其餘框架功能.若是集成WebWork則可使用Spring對Actions等進行管理.app
-- HierarchicalBeanFactory 提供父容器的訪問功能框架
-- -- ConfigurableBeanFactory 如名,提供factory的配置功能,眼花繚亂好多api編輯器
-- -- -- ConfigurableListableBeanFactory 集大成者,提供解析,修改bean定義,並與初始化單例.post
-- ListableBeanFactory 提供容器內bean實例的枚舉功能.這邊不會考慮父容器內的實例.學習
看到這邊,咱們是否是想起了設計模式原則裏的接口隔離原則ui
Interface Segregation Principle(ISP):客戶端不該該依賴它不須要的接口;類間的依賴關係應該創建在最小的接口上
對這個有興趣的話,找度娘或者看看這個設計模式六大原則(4):接口隔離原則
這邊清晰地定義了以下的體系:
根接口BeanFactory(基礎容器)
第二層: 第三方集成,繼承體系,遍歷bean
第三層: 配置功能
第四層: 配置+迭代
接下來具體分析下各個接口吧(順便作目錄):
1. BeanFactory
2. AutowireCapableBeanFactory
3. HierarchicalBeanFactory
4. ListableBeanFactory
5. ConfigurableBeanFactory
6. ConfigurableListableBeanFactory
1. BeanFactory
BeanFactory是Spring bean容器的根接口.
每一個bean都是經過string類型bean name進行標識.這邊提供了設計模式單例,原型的替代實現.
若是bean name配置爲單例,應用內只會獲取到一個實例.若是配置爲原型,那麼能夠實例化好後填充屬性(基於用戶的配置).
BeanFactory做爲應用集中配置管理的地方,極大簡便應用開發,這樣開發人員能夠集中與業務.
BeanFactory須要管理bean的生命週期,好比初始化時須要按順序實現以下接口:
1. BeanNameAware's {@code setBeanName}
2. BeanClassLoaderAware's {@code setBeanClassLoader}
3. BeanFactoryAware's {@code setBeanFactory}
4. ResourceLoaderAware's {@code setResourceLoader}僅對application context有效
5. ApplicationEventPublisherAware's {@code setApplicationEventPublisher}僅對application context有效
6. MessageSourceAware's {@code setMessageSource}僅對application context有效
7. ApplicationContextAware's {@code setApplicationContext}僅對application context有效
8. ServletContextAware's {@code setServletContext}僅對application context有效
9. {@code postProcessBeforeInitialization} methods of BeanPostProcessors
10. InitializingBean's {@code afterPropertiesSet}
11. a custom init-method definition xml中配置的init-method
12. {@code postProcessAfterInitialization} methods of BeanPostProcessors
還有關閉容器的接口:
1. DisposableBean's {@code destroy}
2. a custom destroy-method definition xml配置中的destroy-method
接口裏定義了一個變量String FACTORY_BEAN_PREFIX = "&";
這是用來區分是獲取FactoryBean仍是FactoryBean的createBean建立的實例.若是&開始則獲取FactoryBean;不然獲取createBean建立的實例.
咱們來看下定義的方法:
a, 獲取bean,這邊能夠實現單例,原型
Object getBean(String name) throws BeansException; 能夠用別名查找哦
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException; 這邊的類型能夠是接口或者子類,但不能是null
Object getBean(String name, Object... args) throws BeansException;
b, 判斷是否包含bean.陷阱出現:這邊無論類是否抽象類,懶加載,是否在容器範圍內,只要符合都返回true,因此這邊true,不必定能從getBean獲取實例
boolean containsBean(String name);
c, 單例,原型,bean類型的判斷
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
d, 獲取bean 的類型,別名
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
2. AutowireCapableBeanFactory
在BeanFactory基礎上實現對已存在實例的管理.
可使用這個接口集成其它框架,捆綁並填充並不禁Spring管理生命週期並已存在的實例.像集成WebWork的Actions 和Tapestry Page就很實用.
通常應用開發者不會使用這個接口,因此像ApplicationContext這樣的外觀實現類不會實現這個接口,若是真手癢癢能夠經過ApplicationContext的getAutowireCapableBeanFactory接口獲取.
這邊定義了5種自動裝配策略:不注入AUTOWIRE_NO,使用bean name策略裝配AUTOWIRE_BY_NAME,使用類型裝配策略AUTOWIRE_BY_TYPE,使用構造器裝配策略AUTOWIRE_CONSTRUCTOR,自動裝配策略AUTOWIRE_AUTODETECT
這邊的自動策略是先嚐試構造器,而後纔是byType.這邊應該是跟xml配置文件中的裝配策略對應.
繼續看定義的api:
a, 建立和填充外部bean實例的典型方法
<T> T createBean(Class<T> beanClass) throws BeansException;
void autowireBean(Object existingBean) throws BeansException; // 使用autowireBeanProperties裝配屬性
Object configureBean(Object existingBean, String beanName) throws BeansException; // 自動裝配屬性,填充屬性值,使用諸如setBeanName,setBeanFactory這樣的工廠回調填充屬性,最好還要調用post processor
Object resolveDependency(DependencyDescriptor descriptor, String beanName) throws BeansException;
b, 在bean的生命週期進行細粒度控制的專門方法
Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; // 會執行bean完整的初始化,包括BeanPostProcessors和initializeBean
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;
Object resolveDependency(DependencyDescriptor descriptor, String beanName, Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException;
3. HierarchicalBeanFactory
提供父容器的訪問功能.至於父容器的設置,須要找ConfigurableBeanFactory的setParentBeanFactory(接口把設置跟獲取給拆開了!).
這邊可說的很少,直接上api:
a, 獲取父容器 bean factory
BeanFactory getParentBeanFactory();
b, 判斷當前容器是否保護bean
boolean containsLocalBean(String name);
4. ListableBeanFactory
獲取bean時,Spring 鼓勵使用這個接口定義的api. 還有個Beanfactory方便使用.其餘的4個接口都是不鼓勵使用的.
提供容器中bean迭代的功能,再也不須要一個個bean地查找.好比能夠一次獲取所有的bean(太暴力了),根據類型獲取bean.在看SpringMVC時,掃描包路徑下的具體實現策略就是使用的這種方式(那邊使用的是BeanFactoryUtils封裝的api).
若是同時實現了HierarchicalBeanFactory,返回值不會考慮父類BeanFactory,只考慮當前factory定義的類.固然也可使用BeanFactoryUtils輔助類來查找祖先工廠中的類.
這個接口中的方法只會考慮本factory定義的bean.這些方法會忽略ConfigurableBeanFactory的registerSingleton註冊的單例bean(getBeanNamesOfType和getBeansOfType是例外,同樣會考慮手動註冊的單例).固然BeanFactory的getBean同樣能夠透明訪問這些特殊bean.固然在典型狀況下,全部的bean都是由external bean定義,因此應用不須要顧慮這些差異.
注意:getBeanDefinitionCount和containsBeanDefinition的實現方法由於效率比較低,仍是少用爲好.
繼續上api吧
a, 暴力獲取所有bean的屬性:
boolean containsBeanDefinition(String beanName); //是否包含bean
int getBeanDefinitionCount(); // 當前factory中定義的bean數量
String[] getBeanDefinitionNames(); // 獲取當前工廠中定義的全部bean 的name
b, 根據bean 的類型獲取bean
這邊的方法僅檢查頂級bean.它不會檢查嵌套的bean.FactoryBean建立的bean會匹配爲FactoryBean而不是原始類型.
同樣不會考慮父factory中的bean,非要用能夠經過BeanFactoryUtils中的beanNamesForTypeIncludingAncestors.
其餘方式註冊的單例這邊會歸入判斷.
這個版本的getBeanNamesForType會匹配全部類型的bean,包括單例,原型,FactoryBean.返回的bean names會根據backend 配置的進行排序.
String[] getBeanNamesForType(Class<?> type); // 獲取給定類型的bean names(包括子類),經過bean 定義或者FactoryBean的getObjectType判斷.
String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
<T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException; // 若是保護懶加載的類,FactoryBean初始化的類和工廠方法初始化的類會被初始化.就是說執行這個方法會執行對應的初始化.
<T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException;
c, 查找使用註解的類
Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;
d, 查找一個類上的註解,若是找不到,父類,接口使用註解也算.
<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType);
5. ConfigurableBeanFactory
定義BeanFactory的配置.
這邊定義了太多太多的api,好比類加載器,類型轉化,屬性編輯器,BeanPostProcessor,做用域,bean定義,處理bean依賴關係,合併其餘ConfigurableBeanFactory,bean如何銷燬.
定義了兩個做用域: 單例和原型.能夠經過registerScope來添加.
SCOPE_SINGLETON,SCOPE_PROTOTYPE
這邊定義了好多好多的api,因此咱們這邊只講業務,具體的api看文末的附錄吧:
a, 父容器設置.並且一旦設置了就不讓修改
b, 類加載器設置與獲取.默認使用當前線程中的類加載器
c, 爲了類型匹配,搞個臨時類加載器.好在通常狀況爲null,使用上面定義的標準加載器
d, 是否須要緩存bean metadata,好比bean difinition 和 解析好的classes.默認開啓緩存
e, 定義用於解析bean definition的表達式解析器
f, 類型轉化器
g, 屬性編輯器
h, BeanFactory用來轉換bean屬性值或者參數值的自定義轉換器
i,string值解析器(想起mvc中的ArgumentResolver了)
j,大boss BeanPostProcessor用於加強bean初始化功能
k,做用域定義
l,訪問權限控制
m, 合併其餘ConfigurableBeanFactory的配置,包括上面說到的BeanPostProcessor,做用域等
n, bean定義處理
o, bean建立狀態控制.在解決循環依賴時有使用
p, 處理bean依賴問題
q, bean生命週期管理-- 銷燬bean
6. ConfigurableListableBeanFactory
提供bean definition的解析,註冊功能,再對單例來個預加載(解決循環依賴問題).
貌似咱們通常開發就會直接定義這麼個接口了事.而不是像Spring這樣先根據使用狀況細分那麼多,到這邊再合併
a, 設置忽略的依賴關係,註冊找到的特殊依賴
void ignoreDependencyType(Class<?> type); // 忽略類型
void ignoreDependencyInterface(Class<?> ifc); // 忽略接口
void registerResolvableDependency(Class<?> dependencyType, Object autowiredValue);
boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException;
b, 獲取bean定義 (能夠訪問屬性值跟構造方法的參數值)
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
c, 鎖定配置信息.在調用refresh時會使用到.
void freezeConfiguration();
boolean isConfigurationFrozen();
d, 預加載不是懶加載的單例.用於解決循環依賴問題
void preInstantiateSingletons() throws BeansException;
附錄--ConfigureableBeanFactory中定義的api:
a, 父容器設置.並且一旦設置了就不讓修改
void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
b, 類加載器設置與獲取.默認使用當前線程中的類加載器
void setBeanClassLoader(ClassLoader beanClassLoader);
ClassLoader getBeanClassLoader();
c, 爲了類型匹配,搞個臨時類加載器.好在通常狀況爲null,使用上面定義的標準加載器
void setTempClassLoader(ClassLoader tempClassLoader);
ClassLoader getTempClassLoader();
d, 是否須要緩存bean metadata,好比bean difinition 和 解析好的classes.默認開啓緩存
void setCacheBeanMetadata(boolean cacheBeanMetadata);
boolean isCacheBeanMetadata();
e, 定義用於解析bean definition的表達式解析器
void setBeanExpressionResolver(BeanExpressionResolver resolver);
BeanExpressionResolver getBeanExpressionResolver();
f, 類型轉化器
void setConversionService(ConversionService conversionService);
ConversionService getConversionService();
g, 屬性編輯器
void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);
void copyRegisteredEditorsTo(PropertyEditorRegistry registry);
h, BeanFactory用來轉換bean屬性值或者參數值的自定義轉換器
void setTypeConverter(TypeConverter typeConverter);
TypeConverter getTypeConverter();
i,string值解析器(想起mvc中的ArgumentResolver了)
void addEmbeddedValueResolver(StringValueResolver valueResolver);
String resolveEmbeddedValue(String value);
j,大boss BeanPostProcessor用於加強bean初始化功能
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
int getBeanPostProcessorCount();
k,做用域定義
void registerScope(String scopeName, Scope scope);
String[] getRegisteredScopeNames();
Scope getRegisteredScope(String scopeName);
l,訪問權限控制
AccessControlContext getAccessControlContext();
m, 合併其餘ConfigurableBeanFactory的配置,包括上面說到的BeanPostProcessor,做用域等
void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);
n, bean定義處理
void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException; // 註冊別名
void resolveAliases(StringValueResolver valueResolver);
BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; // 合併bean定義,包括父容器的
boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException; // 是不是FactoryBean類型
o, bean建立狀態控制.在解決循環依賴時有使用
void setCurrentlyInCreation(String beanName, boolean inCreation);
boolean isCurrentlyInCreation(String beanName);
p, 處理bean依賴問題
void registerDependentBean(String beanName, String dependentBeanName);
String[] getDependentBeans(String beanName);
String[] getDependenciesForBean(String beanName);
q, bean生命週期管理-- 銷燬bean
void destroyBean(String beanName, Object beanInstance);
void destroyScopedBean(String beanName);
void destroySingletons();