BeanFactory提供最基本的Ioc容器的功能,BeanFactory只是一個接口類,並無給出容器的具體實現,它經過不一樣的實現類,來定義或者擴充某個功能。
BeanFactory,從名字上也很好理解,生產管理bean的工廠(容器),它負責生產和管理各個bean實例。BeanFactory接口相關的主要繼承結構以下:編輯器
BeanFactory是頂級接口,定義了Ioc容器最基本的形式。ui
public interface BeanFactory { //這裏能夠暫時不用管 String FACTORY_BEAN_PREFIX = "&"; Object getBean(String name) throws BeansException; ... //省略其它方法 }
FACTORY_BEAN_PREFIX是用於與BeanFactory類似類~~~~FactoryBean的相關使用,後續會在Aop講。prototype
經過名字,這定義的是一個可列舉(迭代)的BeanFactory,經過這個BeanFactory能夠查找特定的Bean,相比頂級的BeanFactory,其查詢更加多樣化,牽涉到BeanDefinition,BeanName,註解等。code
public interface ListableBeanFactory extends BeanFactory { // 對於給定的名字是否含有BeanDefinition boolean containsBeanDefinition(String beanName); // 返回工廠的BeanDefinition總數 int getBeanDefinitionCount(); // 返回工廠中全部Bean的名字 String[] getBeanDefinitionNames(); // 返回對於指定類型 獲取bean的名字 String[] getBeanNamesForType(ResolvableType type); //獲取包含某個註解 bean的名字 String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType); // 根據指定Bean名和註解類型查找指定的Bean <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType) throws NoSuchBeanDefinitionException; }
分層式的BeanFactory,這個工廠接口很是簡單,實現了Bean工廠的分層。相對於BeanFactory接口,它只擴展了一個重要的功能————工廠分層,能夠指定父工廠(容器),同時查找Bean的時候,能夠只查看本容器,忽略父容器。對象
public interface HierarchicalBeanFactory extends BeanFactory { BeanFactory getParentBeanFactory(); /** * 返回本地bean工廠是否包含給定名稱的bean, * 忽略父容器上下文中定義的bean。 * <p>這是{@code containsBean}的替代方法, * 忽略bean來自一個父容器工廠的名字。 */ boolean containsLocalBean(String name); }
AutowireCapableBeanFactory目前尚未深刻的研究,這個Beanfactory增長了註解功能,能夠經過註解進行裝配(操做)的工廠(容器)。繼承
public interface AutowireCapableBeanFactory extends BeanFactory { // 這個常量代表工廠沒有自動裝配的Bean int AUTOWIRE_NO = 0; //代表根據名稱自動裝配 int AUTOWIRE_BY_NAME = 1; //代表根據類型自動裝配 int AUTOWIRE_BY_TYPE = 2; //代表根據構造方法裝配 int AUTOWIRE_CONSTRUCTOR = 3; //被廢棄了 @Deprecated int AUTOWIRE_AUTODETECT = 4; <T> T createBean(Class<T> beanClass) throws BeansException; // 給定對象,根據註釋、後處理器等,進行自動裝配 void autowireBean(Object existingBean) throws BeansException; ...//省略後續方法 }
SingletoBeanRegistry接口主要實現了單例類註冊的功能。接口
public interface SingletonBeanRegistry { //註冊一個單例類 void registerSingleton(String beanName, Object singletonObject); Object getSingleton(String beanName); boolean containsSingleton(String beanName); String[] getSingletonNames(); int getSingletonCount(); //不清楚 Object getSingletonMutex(); }
ConfigurableBeanFactory同時繼承了HierarchicalBeanFactory和SingletonBeanRegistry這兩個接口,即同時繼承了分層和單例類註冊的功能。ci
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry { String SCOPE_SINGLETON = "singleton"; String SCOPE_PROTOTYPE = "prototype"; //設置父容器 void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException; void setBeanClassLoader(ClassLoader beanClassLoader); ClassLoader getBeanClassLoader(); void setBeanExpressionResolver(@Nullable 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(); //設置一個Bean後處理器 void addBeanPostProcessor(BeanPostProcessor beanPostProcessor); int getBeanPostProcessorCount(); void registerScope(String scopeName, Scope scope); String[] getRegisteredScopeNames(); Scope getRegisteredScope(String scopeName); void copyConfigurationFrom(ConfigurableBeanFactory otherFactory); /* * 給指定的Bean註冊別名 */ void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException; BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; //判斷指定Bean是否爲一個工廠Bean boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException; void setCurrentlyInCreation(String beanName, boolean inCreation); boolean isCurrentlyInCreation(String beanName); void registerDependentBean(String beanName, String dependentBeanName); String[] getDependentBeans(String beanName); String[] getDependenciesForBean(String beanName); void destroyBean(String beanName, Object beanInstance); void destroyScopedBean(String beanName); void destroySingletons(); ...//省略部分方法 }
工廠接口ConfigrableListableBeanFactory同時繼承了3個接口,ListableBeanFactory、AutowireCapableBeanfactory,ConfigurableBeanFactory,功能已經很全面了。get
public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory { //忽略自動裝配的依賴類型 void ignoreDependencyType(Class<?> type); //忽略自動裝配的接口 void ignoreDependencyInterface(Class<?> ifc); //返回註冊的Bean定義 BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; Iterator<String> getBeanNamesIterator(); ...//忽略部分方法 }
ListableBeanFactory(可列舉的容器(多花樣查詢)),HierarchicalBeanFactory(分層次容器,可有父容器),AutowireCapableBeanFactory(自動裝配容器),這三個容器定義了BeanFactory的基本面貌,在這個三個直系親屬下面又派生了兩個複雜的容器:ConfigurableBeanFactory,ConfigurableListableBeanFactory,可配置的(可操做)的容器,經過這兩個BeanFactory 可有修改容器中的bean,功能又更加高級了,集成了單例bean 服務,以及BeanDefinition 註冊服務,那麼對於 DefaultListableBeanFactory 來講,此時它就是一個可註冊,可配置,可獲取的BeanFactory ,就容器方面而言功能已經健全了。it