Spring 系列目錄(http://www.javashuo.com/article/p-kqecupyl-bm.html)html
BeanFactory 是Spring IOC 容器的鼻祖,是 IOC 容器的基礎接口,全部的容器都是從它這裏繼承實現而來,可見其地位。BeanFactory 提供了最基本的 IOC 容器的功能,即全部的容器至少須要實現的標準。java
public interface BeanFactory { String FACTORY_BEAN_PREFIX = "&"; // 1. getBean 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; // 2. @since 5.1 <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType); <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType); // 3. containsBean boolean containsBean(String name); // 4. 單例、多例。 bean 的生命週期 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; boolean isPrototype(String name) throws NoSuchBeanDefinitionException; // 5. 匹配 bean 的 Class 類型或泛型(ResolvableType) boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException; // 6. 其它屬性 Class<?> getType(String name) throws NoSuchBeanDefinitionException; String[] getAliases(String name); }
這些接口定義勾畫出了 IOC 容器的基本方法特性。BeanFactory 功能以下:spring
BeanFactory 做爲最頂層的一個接口類,它定義了 IOC 容器的基本功能規範,BeanFactory 有三個直接子類接口:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory,還有一個實現類 SimpleJndiBeanFactory。因此接下來依次分析三個子接口。緩存
從 HierarchicalBeanFactory 接口開始就有了父子工廠的概念。app
public interface HierarchicalBeanFactory extends BeanFactory { // 1. 獲取父工廠 BeanFactory getParentBeanFactory(); // 2. 在當前工廠(不向上查找父工廠)中獲取指定的 bean boolean containsLocalBean(String name); }
從 ListableBeanFactory 接口開始能夠枚舉出本工廠生產的全部 bean 了。ide
public interface ListableBeanFactory extends BeanFactory { // 1. 查找 BeanDefinition boolean containsBeanDefinition(String beanName); int getBeanDefinitionCount(); String[] getBeanDefinitionNames(); // 2. 根據類型查找全部 bean 的名稱,包括 FactoryBean // includeNonSingletons=false 表示只取單例; // allowEagerInit=true 表示當即加載,false 表示延遲加載。注意:FactoryBean 都是馬上加載的 String[] getBeanNamesForType(Class<?> type); String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit); // 3. 根據類型查找全部 bean,返回 <beanName, bean> <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException; <T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException; // 4.1 根據類上的註解類型查找指定的 bean String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType); Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException; // 4.2 查找指定 bean 上的註解 <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType) throws NoSuchBeanDefinitionException; }
總結一下:post
從 AutowireCapableBeanFactory 接口開始能夠自動裝配 bean 了。ui
AutowireCapableBeanFactory 直接繼承自 BeanFacotory,它擴展了自動裝配的功能,根據類定義 BeanDefinition 裝配 Bean、執行後置處理器等。值得注意的是,這個接口並無被 ApplicationContext 繼承,由於應用程序幾乎不用用到這些接口,固然也能夠經過 ApplicationContext#getAutowireCapableBeanFactory() 得到這個 BeanFactory 實例。prototype
public interface AutowireCapableBeanFactory extends BeanFactory { // 1. 自動裝配的模式,AUTOWIRE_AUTODETECT 已廢棄 int AUTOWIRE_NO = 0; int AUTOWIRE_BY_NAME = 1; int AUTOWIRE_BY_TYPE = 2; int AUTOWIRE_CONSTRUCTOR = 3; int AUTOWIRE_AUTODETECT = 4; //------------------------------------------------------------------------- // Typical methods for creating and populating external bean instances //------------------------------------------------------------------------- // 2. 默認的方式建立、自動裝配、配置 bean <T> T createBean(Class<T> beanClass) throws BeansException; void autowireBean(Object existingBean) throws BeansException; Object configureBean(Object existingBean, String beanName) throws BeansException; //------------------------------------------------------------------------- // Specialized methods for fine-grained control over the bean lifecycle //------------------------------------------------------------------------- // 3. 根據給定的策略,建立、自動裝配、配置 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; // 4. bean 屬性注入 void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException; // 5. bean 生命週期相關的初始化,如 BeanFactoryAware#setBeanFactory、InitializingBean#afterPropertiesSet Object initializeBean(Object existingBean, String beanName) throws BeansException; void destroyBean(Object existingBean); // 6. 後置處理器 BeanPostProcessors 執行 Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException; Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException; // 7. <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException; // 8. 屬性注入時根據類型查找依賴,支持 List<BeanA> list 集合類型注入 Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException; Object resolveDependency(DependencyDescriptor descriptor, String beanName, Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException; }
總結一下:code
AUTOWIRE_BY_NAME
:把與 Bean 的屬性具備相同的名字的其餘 Bean 自動裝配到這個屬性上。舉個例子就是:當有一個屬性名字爲 person 時,則自動裝配策略選擇 id 爲 person 的 Bean 進行裝配。AUTOWIRE_BY_TYPE
:把與 Bean 的屬性具備相同的類型的其餘 Bean 自動裝配到這個屬性。AUTOWIRE_BY_CONSTRUCT
:把與 bean 的構造器入參具備相同類型的其餘 Bean 自動裝配到 Bean 構造器的對應參數中。還有兩類方法,實際上工做中不多直接用這幾個接口
實現類爲 AbstractAutowireCapableBeanFactory。還有兩個配置的接口 ConfigurableBeanFactory 和 ConfigurableListableBeanFactory 也須要關注一下。
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry { String SCOPE_SINGLETON = "singleton"; String SCOPE_PROTOTYPE = "prototype"; // 1. 父工廠 void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException; // 2. ClassLoader void setBeanClassLoader(@Nullable ClassLoader beanClassLoader); ClassLoader getBeanClassLoader(); void setTempClassLoader(@Nullable ClassLoader tempClassLoader); ClassLoader getTempClassLoader(); // 3. 緩存 void setCacheBeanMetadata(boolean cacheBeanMetadata); boolean isCacheBeanMetadata(); // 4. Spring el 表達式解析器 void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver); BeanExpressionResolver getBeanExpressionResolver(); // 5.1 ConversionService 類型轉換 void setConversionService(@Nullable ConversionService conversionService); ConversionService getConversionService(); // 5.2 PropertyEditor 類型轉換 void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar); void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass); void copyRegisteredEditorsTo(PropertyEditorRegistry registry); // 5.3 類型轉換 void setTypeConverter(TypeConverter typeConverter); TypeConverter getTypeConverter(); // 6. ${key} 佔位符解析 void addEmbeddedValueResolver(StringValueResolver valueResolver); boolean hasEmbeddedValueResolver(); String resolveEmbeddedValue(String value); // 7. 後置處理器 void addBeanPostProcessor(BeanPostProcessor beanPostProcessor); int getBeanPostProcessorCount(); // 8. void registerScope(String scopeName, Scope scope); String[] getRegisteredScopeNames(); Scope getRegisteredScope(String scopeName); AccessControlContext getAccessControlContext(); // 9. copy 配置 void copyConfigurationFrom(ConfigurableBeanFactory otherFactory); // 10. bean 別名註冊 void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException; void resolveAliases(StringValueResolver valueResolver); // 11. BeanDefinition BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; // 12. FactoryBean boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException; // 13. bean 建立狀態 void setCurrentlyInCreation(String beanName, boolean inCreation); boolean isCurrentlyInCreation(String beanName); // 14. 註冊依賴 void registerDependentBean(String beanName, String dependentBeanName); String[] getDependentBeans(String beanName); String[] getDependenciesForBean(String beanName); // 15. 銷燬 bean void destroyBean(String beanName, Object beanInstance); void destroyScopedBean(String beanName); void destroySingletons(); }
實現類爲 AbstractBeanFactory。
提供解析,修改 bean定義,並與初始化單例。
public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory { // 1. 忽略依賴檢查,如 String/BeanFacory void ignoreDependencyType(Class<?> type); void ignoreDependencyInterface(Class<?> ifc); // 2. 註冊依賴關係 void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue); // 3. 依賴注入時查找是不是能夠依賴的 bean boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException; // 4. BeanDefinition 和 bean 遍歷 BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; Iterator<String> getBeanNamesIterator(); // 5. 清除不能緩存的 BeanDefinition,當 configurationFrozen=true 時能夠緩存 void clearMetadataCache(); // 5.2 configurationFrozen=true 時緩存 BeanDefinition 信息 void freezeConfiguration(); boolean isConfigurationFrozen(); // 6. 實例化非懶加載的 bean void preInstantiateSingletons() throws BeansException; }
實現類爲 DefaultListableBeanFactory。
此外 Spring BeanFactory 的實現還有三個重要的實現類,功能以下:
AbstractBeanFactory
實現了 BeanFactory、 HierarchicalBeanFactory、ConfigurableBeanFactory 三個接口,最重要的方法是實現了 getBean(beanName) 接口,這個方法的最重要的步驟-建立 bean 則委託給模板方法 createBean 完成。
AbstractAutowireCapableBeanFactory
實現了 AutowireCapableBeanFactory 接口,也就是依賴注入。同時實現了 crcreateBean(beanName, mbd, args) 建立 bean 的三個重要過程:實例化(createBeanInstance)、依賴注入(populateBean)、初始化(initializeBean)。其中依賴注入又分爲 autowireByName 和 autowireByType 二種,其中名稱查找很簡單,而類型查找就複雜了不少。Spring 將類型查找委託給了子類的 resolveDependency 完成。
DefaultListableBeanFactory
實現了 ConfigurableListableBeanFactory、BeanDefinitionRegistry 兩個接口,提供了 Bean 和 BeanDefinition 查找註冊的功能。 這個類一個很重要的功能是實現了模板方法 resolveDependency,這樣就能夠根據類型查找依賴。
天天用心記錄一點點。內容也許不重要,但習慣很重要!