在学习spring容器中,最先接触的可能是 ApplicationContext,但beanFactory才是spring提供的最顶级的容器。
beanFactorybeanFactory 从名称上来看,它的意思是bean 工厂,它是生产 bean 与保存 bean (针对单例 bean)的地方。
我们先来看看beanFactory提供了哪些方法:
public interface BeanFactory {
/**
* factoryBean使用
*/
String FACTORY_BEAN_PREFIX = "&";
/**
* 根据名称获取bean
*/
Object getBean(String name) throws BeansException;
/**
* 根据名称获取bean
*/
T getBean(String name, Class requiredType) throws BeansException;
/**
* 根据名称获取bean
*/
Object getBean(String name, Object... args) throws BeansException;
/**
* 根据类型获取bean
*/
T getBean(Class requiredType) throws BeansException;
/**
* 根据类型获取bean
*/
T getBean(Class requiredType, Object... args) throws BeansException;
/**
* 获取BeanProvider
*/
ObjectProvider getBeanProvider(Class requiredType);
/**
* 获取BeanProvider
*/
ObjectProvider getBeanProvider(ResolvableType requiredType);
/**
* 是否包含bean
*/
boolean containsBean(String name);
/**
* 是否为单例bean
*/
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
/**
* 是否为原型bean
*/
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
/**
* 判断类型是否匹配
*/
boolean isTypeMatch(String name, ResolvableType typeToMatch)
throws NoSuchBeanDefinitionException;
/**
* 判断类型是否匹配
*/
boolean isTypeMatch(String name, Class> typeToMatch)
throws NoSuchBeanDefinitionException;
/**
* 根据名称获取bean的类型
*/
@Nullable
Class> getType(String name) throws NoSuchBeanDefinitionException;
/**
* 根据名称获取bean的类型
*/
@Nullable
Class> getType(String name, boolean allowFactoryBeanInit)
throws NoSuchBeanDefinitionException;
/**
* 根据bean名称获取bean的别名
*/
String[] getAliases(String name);
}
BeanFactory 接口定义了beanFactory的基本操作,可以看到,其提供了非常多的getBean(...)方法。
我们再看看看beanFactory 的继承关系:

可以看到,beanFactory 经过了重重继承,功能也由其子接口一步步扩展,接口提供功能,类来进行实现,最终得到的是DefaultListableBeanFactory,这也是 spring 默认使用的beanFactory。
我们来看看这些接口的功能:
BeanFactory:最基本的BeanFactory,定义了基本的操作HierarchicalBeanFactory:提供了继承功能,用来获取ParentBeanFactory(设置ParentBeanFactory的操作在ConfigurableBeanFactory中)ListableBeanFactory:提供list操作,如列出符合条件的BeanName、BeanConfigurableBeanFactory:提供配置操作,如设置ParentBeanFactory、设置BeanClassLoader、设置BeanClassLoader等AutowireCapableBeanFactory:提供bean的手动注入功能,如createBean(Class)可以将Class初始化spring bean,autowireBean(Object)可以将一个java实例初始化成spring beanConfigurableListableBeanFactory:组合了ListableBeanFactory与ConfigurableBeanFactory接口的功能最后是DefaultListableBeanFactory,这个类实现了以上的所有接口,包含了上面的所有功能,接下来我分析我们基本都是基于这个类。
DefaultListableBeanFactoryspring 的 applicationContext 中默认的 beanFactory 就是 DefaultListableBeanFactory,因此这个类非常非常重要,这里我们简单列举下平时经常用到的属性:
beanDefinitionMap:存放beanDefinition的MapbeanDefinitionNames:存放beanDefinition名称的ListsingletonObjects:继承自DefaultSingletonBeanRegistry类,存放单例bean的map在 beanFactory 中,最重要的内容要算beanDefinition与singletonBean了,DefaultListableBeanFactory中有各自对应的结构来存储这些。接下来我们再看看一些重要的方法:
| 方法 | 说明 |
|---|---|
DefaultSingletonBeanRegistry#addSingleton(String, Object) |
手动添加一个单例 bean 到 beanFactory 中 |
AbstractAutowireCapableBeanFactory#createBean(Class>, int, boolean) |
手动创建一个spring bean(有完整的spring bean生命周期,即实例化、属性注入、初始化等) |
AbstractAutowireCapableBeanFactory#autowire(Class>, int, boolean) |
创建对应的Class实例后,再对其属性注入(只有两个操作:实例化、属性注入) |
AbstractAutowireCapableBeanFactory#autowireBean(Object) |
对传入的bean进行属性注入(只有属性注入操作) |
BeanFactory#getBean(String, ...) |
根据bean的名称获取对应的bean,如果该bean不存在但对应的beanDefinition存在,则创建bean,如果对应的beanDefinition |