1.总所周知,spring ioc功能实现的顶层接口就是BeanFactory。如下面类结构图
这张更加全面:
还有更加变态的
2.BeanFactory为最顶层接口,定义了最核心的需要实现的接口
package org.springframework.beans.factory; public interface BeanFactory { /** * 用来引用一个实例,或把它和工厂产生的Bean区分开,就是说,如果一个FactoryBean的名字为a,那么,&a会得到那个Factory */ String FACTORY_BEAN_PREFIX = "&"; /* * 四个不同形式的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; }
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(); //销毁所有的单例类 }
在具体介绍之前,先看一下接口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名是否被注册过。 }