Spring的BeanFactory体系结构一

工作中使用spring 有几年的时间了,一直使用spring里面的一些核心的api,也没有去深入学习具体的结构体系,最近心血来潮想对里面的体系结构做一个深入的学习。特整理了一张beanFactory结构体系图:

[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);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值