工作中使用spring 有几年的时间了,一直使用spring里面的一些核心的api,也没有去深入学习具体的结构体系,最近心血来潮想对里面的体系结构做一个深入的学习。特整理了一张beanFactory结构体系图:
[img]http://dl.iteye.com/upload/picture/pic/78494/d13e3946-c5d2-352b-89d0-0ae1507b78f3.jpg[/img]
BeanFactory 接口位于类结构树的顶端,接口里面最主要的方法是getBean(String),方法的功能是返回特定的名称的Bean;
BeanFactory 的强大功能是通过其它接口不断扩展。对上图的接口进行说明一下。
1 AutowireCapableBeanFactory:定义了将容器中的Bean按某种规则(如按名字,类型的匹配等)进行自动装配的方法。在我们开发的应用中很少用到,更多的作用是和其它组件结合,把不在spring容器中的bean加入到spring的生命周期中。
在ApplicationContent接口中可以通过getAutowireCapableBeanFactory()方法得到AutowireCapableBeanFactory对象。
还可以实际BeanFactoryAware接口setBeanFactory进来,BeanFactory可以转换成AutowireCapableBeanFactory。
2 ListableBeanFactory:这个接口定义访问容器中的Bean基本信息,查看bean的个数,获取某一类型Bean的配置名,查看是否包含某一Bean;
3 HierarchicalBeanFactory:父子级联IOC容器的接口,子容器可以通过接口方法访问你容器;如果使用了此接口,那么你也要相应的实现ConfigurableBeanFactory接口,因为ConfigurableBeanFactory中有设置父容器的方法。而HierarchicalBeanFactory的方法中只有获取父容器的方法。所以实现此接口也要设置父容器。
4 SingletonBeanRegistry:定义了允许在运行期间向容器注册单实例Bean的方法;
ConfigurableBeanFactory接口就继承了此接口。
5 ConfigurableBeanFactory:是一个重要的接口,增强了ioc容器的可定制性,它定义了设置类装载器,属性编辑器,容器初始化后置处理器等方法;几乎所有的beanFactory都会实现这个接口,赋予了BeanFactory可扩展的功能。
6 ConfigurableListableBeanFactory:除了ListableBeanFactory和AutowireCapableBeanFactory功能之外还提供了访问和修改BeanDefinition,预实例化singleton列表。
7 BeanDefinitionRegistry:spring配置文件中的每一个bean节点元素在spring容器里都通过一个BeanDefinition对象表示,描述了Bean的配置信息。而BeanDefinitionRegistry接口提供了向容器手工注册BeanDefinition对象的方法;
8 AliasRegistry:管理别名的公共接口,
[img]http://dl.iteye.com/upload/picture/pic/78494/d13e3946-c5d2-352b-89d0-0ae1507b78f3.jpg[/img]
BeanFactory 接口位于类结构树的顶端,接口里面最主要的方法是getBean(String),方法的功能是返回特定的名称的Bean;
public interface BeanFactory {
//对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象
String FACTORY_BEAN_PREFIX = "&";
//这里根据bean的名字,在IOC容器中得到bean实例
Object getBean(String name) throws BeansException;
//通过bean的名字和类型得到一个bean的实例,以上面那个接口不同的是得到bean实例会查询是否是参数传进来的类型。
Object getBean(String name, Class requiredType) throws BeansException;
//同上 ,会检查是否是一堆类型的bean实例。
Object getBean(String name, Object[] args) throws BeansException;
//提供对bean的查找,是否在IOC容器有这个名字的bean
boolean containsBean(String name);
//判断给定名称的bean定义(或bean实例)是否为singleton/Prototype模式,如果bean没找到,则抛出NoSuchBeanDefinitionException异常。
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
//检测给定的名称获取的类,是不是与给定的class类型相匹配,如果匹配,返回ture,否则返回flase,如果给定名称转化成类失败,相应的异常(NoSuchBeanDefinitionException)将被抛出
boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException;
//通过bean的名字得到bean的原始类型
Class getType(String name) throws NoSuchBeanDefinitionException;
//通过bean的名字,检索到一组别名。
String[] getAliases(String name);
}
BeanFactory 的强大功能是通过其它接口不断扩展。对上图的接口进行说明一下。
1 AutowireCapableBeanFactory:定义了将容器中的Bean按某种规则(如按名字,类型的匹配等)进行自动装配的方法。在我们开发的应用中很少用到,更多的作用是和其它组件结合,把不在spring容器中的bean加入到spring的生命周期中。
在ApplicationContent接口中可以通过getAutowireCapableBeanFactory()方法得到AutowireCapableBeanFactory对象。
还可以实际BeanFactoryAware接口setBeanFactory进来,BeanFactory可以转换成AutowireCapableBeanFactory。
Object createBean(Class beanClass) throws BeansException;
void autowireBean(Object existingBean) throws BeansException;
Object configureBean(Object existingBean, String beanName) throws BeansException;
Object resolveDependency(DependencyDescriptor descriptor, String beanName) throws BeansException;
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;
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 autowiredBeanNames, TypeConverter typeConverter) throws BeansException;
2 ListableBeanFactory:这个接口定义访问容器中的Bean基本信息,查看bean的个数,获取某一类型Bean的配置名,查看是否包含某一Bean;
public interface ListableBeanFactory extends BeanFactory {
boolean containsBeanDefinition(String beanName);
int getBeanDefinitionCount();
String[] getBeanDefinitionNames();
String[] getBeanNamesForType(Class type);
String[] getBeanNamesForType(Class type, boolean includeNonSingletons, boolean allowEagerInit);
Map getBeansOfType(Class type) throws BeansException;
Map getBeansOfType(Class type, boolean includeNonSingletons, boolean allowEagerInit)
throws BeansException;
}
3 HierarchicalBeanFactory:父子级联IOC容器的接口,子容器可以通过接口方法访问你容器;如果使用了此接口,那么你也要相应的实现ConfigurableBeanFactory接口,因为ConfigurableBeanFactory中有设置父容器的方法。而HierarchicalBeanFactory的方法中只有获取父容器的方法。所以实现此接口也要设置父容器。
public interface HierarchicalBeanFactory extends BeanFactory {
//父子级联IOC容器的接口,子容器可以通过接口方法访问你容器
BeanFactory getParentBeanFactory();
//提供对bean的查找,是否在IOC容器有这个名字的bean
boolean containsLocalBean(String name);
}
4 SingletonBeanRegistry:定义了允许在运行期间向容器注册单实例Bean的方法;
ConfigurableBeanFactory接口就继承了此接口。
public interface SingletonBeanRegistry {
void registerSingleton(String beanName, Object singletonObject);
Object getSingleton(String beanName);
boolean containsSingleton(String beanName);
String[] getSingletonNames();
int getSingletonCount();
}
5 ConfigurableBeanFactory:是一个重要的接口,增强了ioc容器的可定制性,它定义了设置类装载器,属性编辑器,容器初始化后置处理器等方法;几乎所有的beanFactory都会实现这个接口,赋予了BeanFactory可扩展的功能。
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 setTempClassLoader(ClassLoader tempClassLoader);
ClassLoader getTempClassLoader();
void setCacheBeanMetadata(boolean cacheBeanMetadata);
boolean isCacheBeanMetadata();
void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
void registerCustomEditor(Class requiredType, Class propertyEditorClass);
void registerCustomEditor(Class requiredType, PropertyEditor propertyEditor);
void copyRegisteredEditorsTo(PropertyEditorRegistry registry);
void setTypeConverter(TypeConverter typeConverter);
TypeConverter getTypeConverter();
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
int getBeanPostProcessorCount();
void registerScope(String scopeName, Scope scope);
String[] getRegisteredScopeNames();
Scope getRegisteredScope(String scopeName);
void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);
void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;
void resolveAliases(StringValueResolver valueResolver);
BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;
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();
}
6 ConfigurableListableBeanFactory:除了ListableBeanFactory和AutowireCapableBeanFactory功能之外还提供了访问和修改BeanDefinition,预实例化singleton列表。
public interface ConfigurableListableBeanFactory
extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
void ignoreDependencyType(Class type);
void ignoreDependencyInterface(Class ifc);
void registerResolvableDependency(Class dependencyType, Object autowiredValue);
boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor)
throws NoSuchBeanDefinitionException;
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
void freezeConfiguration();
boolean isConfigurationFrozen();
void preInstantiateSingletons() throws BeansException;
}
7 BeanDefinitionRegistry:spring配置文件中的每一个bean节点元素在spring容器里都通过一个BeanDefinition对象表示,描述了Bean的配置信息。而BeanDefinitionRegistry接口提供了向容器手工注册BeanDefinition对象的方法;
public interface BeanDefinitionRegistry extends AliasRegistry {
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException;
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
boolean containsBeanDefinition(String beanName);
String[] getBeanDefinitionNames();
int getBeanDefinitionCount();
boolean isBeanNameInUse(String beanName);
}
8 AliasRegistry:管理别名的公共接口,
public interface AliasRegistry {
//注册一个别名
void registerAlias(String name, String alias);
//删除别名
void removeAlias(String alias);
//判断是否是别名
boolean isAlias(String beanName);
//获得一个名字的所有别名,以String数组的形式返回
String[] getAliases(String name);
}