spring IOC有两个主要容器BeanFactory简单容器,提供最基本的IOC容器功能
而ApplicationContext应用上下文在简单容器的基础上增加了许多面向框架的特性
BeanDefinition则对应了配置文件中的<bean>
首先看下BeanFactory接口的结构下面有三个子接口和一个实现类
下面看BeanFactory源码
在BeanFactory中String FACTORY_BEAN_PREFIX = "&";&用来区分通过容器获取FactoryBean产生的对象和FactoryBean本身,如b是一个BeanFactory对象,&b得到的是FactoryBean,而不是b这个FactoryBean产生出来的对象
public boolean containsBean(String name)判断容器是否含有指定名字的Bean
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;//查询指定名字的Bean是不是单例
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;//查询指定名字的Bean是不是prototype类型的,与上面一个可以再BeanDefinition中定义
boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;//查询指定名字的Bean的Class类型是否是特定的Class类型
public boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException {
//查询指定名字的Bean的Class
Class type = getType(name);
//targetType为null时为true,不为null时并且targetType是否为type的超类或超接口
return (targetType == null || (type != null && targetType.isAssignableFrom(type)));
}
String[] getAliases(String name);//查询指定名字的Bean的所有别名
实现类:SimpleJndiBeanFactory
子接口1:AutowireCapableBeanFactory
子接口2:HierarchicalBeanFactory:多了两个方法
BeanFactory getParentBeanFactory();//返回父beanfactory,如果没有为null
boolean containsLocalBean(String name);//判断是否存在给定名称的Bean
子接口3:ListableBeanFactory
ConfigurableBeanFactory是HierarchicalBeanFactory的子接口,主要定义了一些BeanFactory的配置功能,下面看下源码
//设置父BeanFactory
void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
/**
BeanPostProcessor 是spring容器的一个扩展点,可以进行自定义实例化、初始化、依赖转配、依赖检查等流程,既可以覆盖默认的实例化,也可以增强初始化、依赖注入、依赖检查等流程,可以检查相应的标志接口完成一些自定义功能实现,如包装目标对象到代理对象
*/
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
XmlBeanFactory继承DefaultListableBeanFactory,在spring中后者作为一个默认的功能完整的Ioc容器来使用,XmlBeanFactory从名字就可以看出他可以读取以xm方式定义的BeanDefinition的IOC容器。
从源码中private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);来读取xml中的数据