在学习spring容器中,最先接触的可能是 ApplicationContext
,但beanFactory
才是spring提供的最顶级的容器。
beanFactory
beanFactory
从名称上来看,它的意思是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
、Bean
ConfigurableBeanFactory
:提供配置操作,如设置ParentBeanFactory
、设置BeanClassLoader
、设置BeanClassLoader
等AutowireCapableBeanFactory
:提供bean的手动注入功能,如createBean(Class)
可以将Class
初始化spring bean,autowireBean(Object)
可以将一个java实例初始化成spring beanConfigurableListableBeanFactory
:组合了ListableBeanFactory
与ConfigurableBeanFactory
接口的功能最后是DefaultListableBeanFactory
,这个类实现了以上的所有接口,包含了上面的所有功能,接下来我分析我们基本都是基于这个类。
DefaultListableBeanFactory
spring 的 applicationContext
中默认的 beanFactory
就是 DefaultListableBeanFactory
,因此这个类非常非常重要,这里我们简单列举下平时经常用到的属性:
beanDefinitionMap
:存放beanDefinition
的Map
beanDefinitionNames
:存放beanDefinition
名称的List
singletonObjects
:继承自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 |