容器之beanfactory抽絲剝繭系列一
阿新 • • 發佈:2018-11-12
1.總所周知,spring ioc功能實現的頂層介面就是BeanFactory。如下面類結構圖
這張更加全面:
還有更加變態的
2.BeanFactory為最頂層介面,定義了最核心的需要實現的介面
package org.springframework.beans.factory; public interface BeanFactory { /** * 用來引用一個例項,或把它和工廠產生的Bean區分開,就是說,如果一個FactoryBean的名字為a,那麼,&a會得到那個Factory */ String FACTORY_BEAN_PREFIXView Code= "&"; /* * 四個不同形式的getBean方法,獲取例項 */ Object getBean(String name) throws BeansException; <T> T getBean(String name, Class<T> requiredType) throws BeansException; <T> T getBean(Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args)throws BeansException; boolean containsBean(String name); // 是否存在 boolean isSingleton(String name) throws NoSuchBeanDefinitionException;// 是否為單例項 boolean isPrototype(String name) throws NoSuchBeanDefinitionException;// 是否為原型(多例項) boolean isTypeMatch(String name, Class<?> targetType)throws NoSuchBeanDefinitionException;// 名稱、型別是否匹配 Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 獲取型別 String[] getAliases(String name);// 根據例項的名字獲取例項的別名 }
3.分層的Bean工廠:HierarchicalBeanFactory,定義工廠之間的層級關係
public interface HierarchicalBeanFactory extends BeanFactory { BeanFactory getParentBeanFactory(); // 返回本Bean工廠的父工廠 boolean containsLocalBean(String name); // 本地工廠是否包含這個Bean,忽略其他所有父工廠 }
4.可將Bean逐一列出的工廠——ListableBeanFactory
public interface ListableBeanFactory extends BeanFactory { boolean containsBeanDefinition(String beanName); // 對於給定的名字是否含有BeanDefinition int getBeanDefinitionCount(); // 返回工廠的BeanDefinition總數 String[] getBeanDefinitionNames(); // 返回工廠中所有Bean的名字 String[] getBeanNamesForType(Class<?> type); // 返回對於指定型別Bean(包括子類)的所有名字 /* * 返回指定型別的名字 includeNonSingletons為false表示只取單例Bean,true則不是 * allowEagerInit為true表示立刻載入,false表示延遲載入。 注意:FactoryBeans都是立刻載入的。 */ String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit); <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException; // 根據型別(包括子類)返回指定Bean名和Bean的Map <T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException; Map<String, Object> getBeansWithAnnotation( Class<? extends Annotation> annotationType) throws BeansException; // 根據註解型別,查詢所有有這個註解的Bean名和Bean的Map <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType);// 根據指定Bean名和註解型別查詢指定的Bean }
5.自動裝配的Bean工廠——AutowireCapableBeanFactory
public interface AutowireCapableBeanFactory extends BeanFactory { int AUTOWIRE_NO = 0; // 這個常量表明工廠沒有自動裝配的Bean int AUTOWIRE_BY_NAME = 1; //表明根據名稱自動裝配 int AUTOWIRE_BY_TYPE = 2; //表明根據型別自動裝配 int AUTOWIRE_CONSTRUCTOR = 3; //表明根據構造方法快速裝配 @Deprecated int AUTOWIRE_AUTODETECT = 4; //表明通過Bean的class的內部來自動裝配(有沒翻譯錯...)Spring3.0被棄用。 <T> T createBean(Class<T> beanClass) throws BeansException; // 根據指定Class建立一個全新的Bean例項 void autowireBean(Object existingBean) throws BeansException; // 給定物件,根據註釋、後處理器等,進行自動裝配 /* * 根據Bean名的BeanDefinition裝配這個未加工的Object,執行回撥和各種後處理器。 */ Object configureBean(Object existingBean, String beanName) throws BeansException; /* * 分解Bean在工廠中定義的這個指定的依賴descriptor */ Object resolveDependency(DependencyDescriptor descriptor, String beanName) throws BeansException; /* * 根據給定的型別和指定的裝配策略,建立一個新的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; /* * 初始化一個Bean... */ Object initializeBean(Object existingBean, String beanName) throws BeansException; /* * 初始化之前執行BeanPostProcessors */ Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException; /* * 初始化之後執行BeanPostProcessors */ Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException; /* * 分解指定的依賴 */ Object resolveDependency(DependencyDescriptor descriptor, String beanName, Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException; }View Code
6.複雜的配置Bean工廠——ConfigurableBeanFactory
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry { String SCOPE_SINGLETON = "singleton"; // 單例 String SCOPE_PROTOTYPE = "prototype"; // 原型 /* * 搭配HierarchicalBeanFactory介面的getParentBeanFactory方法 */ void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException; /* * 設定、返回工廠的類載入器 */ void setBeanClassLoader(ClassLoader beanClassLoader); ClassLoader getBeanClassLoader(); /* * 設定、返回一個臨時的類載入器 */ void setTempClassLoader(ClassLoader tempClassLoader); ClassLoader getTempClassLoader(); /* * 設定、是否快取元資料,如果false,那麼每次請求例項,都會從類載入器重新載入(熱載入) */ void setCacheBeanMetadata(boolean cacheBeanMetadata); boolean isCacheBeanMetadata();//是否快取元資料 /* * Bean表示式分解器 */ void setBeanExpressionResolver(BeanExpressionResolver resolver); BeanExpressionResolver getBeanExpressionResolver(); /* * 設定、返回一個轉換服務 */ void setConversionService(ConversionService conversionService); ConversionService getConversionService(); /* * 設定屬性編輯登記員... */ void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar); /* * 註冊常用屬性編輯器 */ void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass); /* * 用工廠中註冊的通用的編輯器初始化指定的屬性編輯註冊器 */ void copyRegisteredEditorsTo(PropertyEditorRegistry registry); /* * 設定、得到一個型別轉換器 */ void setTypeConverter(TypeConverter typeConverter); TypeConverter getTypeConverter(); /* * 增加一個嵌入式的StringValueResolver */ void addEmbeddedValueResolver(StringValueResolver valueResolver); String resolveEmbeddedValue(String value);//分解指定的嵌入式的值 void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);//設定一個Bean後處理器 int getBeanPostProcessorCount();//返回Bean後處理器的數量 void registerScope(String scopeName, Scope scope);//註冊範圍 String[] getRegisteredScopeNames();//返回註冊的範圍名 Scope getRegisteredScope(String scopeName);//返回指定的範圍 AccessControlContext getAccessControlContext();//返回本工廠的一個安全訪問上下文 void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);//從其他的工廠複製相關的所有配置 /* * 給指定的Bean註冊別名 */ void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException; void resolveAliases(StringValueResolver valueResolver);//根據指定的StringValueResolver移除所有的別名 /* * 返回指定Bean合併後的Bean定義 */ BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;//判斷指定Bean是否為一個工廠Bean void setCurrentlyInCreation(String beanName, boolean inCreation);//設定一個Bean是否正在建立 boolean isCurrentlyInCreation(String beanName);//返回指定Bean是否已經成功建立 void registerDependentBean(String beanName, String dependentBeanName);//註冊一個依賴於指定bean的Bean String[] getDependentBeans(String beanName);//返回依賴於指定Bean的所欲Bean名 String[] getDependenciesForBean(String beanName);//返回指定Bean依賴的所有Bean名 void destroyBean(String beanName, Object beanInstance);//銷燬指定的Bean void destroyScopedBean(String beanName);//銷燬指定的範圍Bean void destroySingletons(); //銷燬所有的單例類 }View Code
在具體介紹之前,先看一下介面SingletonBeanRegistry的原始碼:
public interface SingletonBeanRegistry { void registerSingleton(String beanName, Object singletonObject); //在容器內註冊一個單例類 Object getSingleton(String beanName);//返回給定名稱對應的單例類 boolean containsSingleton(String beanName);//給定名稱是否對應單例類 String[] getSingletonNames();//返回容器內所有單例類的名字 int getSingletonCount();//返回容器內註冊的單例類數量 }
SingletonBeanRegistry這個介面非常簡單,5個方法,實現了單例類註冊的功能。
ConfigurableBeanFactory同時繼承了HierarchicalBeanFactory 和 SingletonBeanRegistry 這兩個介面,即同時繼承了分層和單例類註冊的功能。
7.BeanFactory的集大成者:ConfigurableListableBeanFactory
public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory { void ignoreDependencyType(Class<?> type);//忽略自動裝配的依賴型別 void ignoreDependencyInterface(Class<?> ifc);//忽略自動裝配的介面 /* * 註冊一個可分解的依賴 */ void registerResolvableDependency(Class<?> dependencyType, Object autowiredValue); /* * 判斷指定的Bean是否有資格作為自動裝配的候選者 */ boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException; /* * 返回註冊的Bean定義 */ BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; void freezeConfiguration();//暫時凍結所有的Bean配置 boolean isConfigurationFrozen();//判斷本工廠配置是否被凍結 void preInstantiateSingletons() throws BeansException;//使所有的非延遲載入的單例類都例項化。 }
8.額外的介面:BeanDefinitionRegistry
這個介面基本用來操作定義在工廠內部的BeanDefinition的。我們先來看一下這個介面的父介面:
public interface AliasRegistry { void registerAlias(String name, String alias);//對指定的名稱註冊別名 void removeAlias(String alias);//從當前容器移除指定別名 boolean isAlias(String beanName);//判斷指定名稱是否為別名 String[] getAliases(String name);//返回指定名稱的所有別名 }
可以看到這4個方法都非常簡單,都是用來操作別名的。
再來看一下BeanDefinitionRegistry的原始碼:
public interface BeanDefinitionRegistry extends AliasRegistry { void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;//給定bean名稱,註冊一個新的bean定義 /* * 根據指定Bean名移除對應的Bean定義 */ void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; /* * 根據指定bean名得到對應的Bean定義 */ BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; /* * 查詢,指定的Bean名是否包含Bean定義 */ boolean containsBeanDefinition(String beanName); String[] getBeanDefinitionNames();//返回本容器內所有註冊的Bean定義名稱 int getBeanDefinitionCount();//返回本容器內註冊的Bean定義數目 boolean isBeanNameInUse(String beanName);//指定Bean名是否被註冊過。 }