Spring源码分析:Bean容器BeanFactory体系详解
1、BeanFactory接口体系
BeanFactory体系下主要可以分类两类,基础BeanFactory的体系:主要包括BeanFactory、HierarchicalBeanFactory、AutowireCapableBeanFactory、ListableBeanFactory、ConfigurableBeanFactory和ConfigurableListableBeanFactory。
另一类主要是继承自ApplicationContext的应用上下文接口:主要包括ApplicationContext、ConfigurableApplicationContext、WebApplicationContext和ConfigurableWebApplicationContext。
1.1 、基础BeanFactory层级结构
1.1.1、BeanFactory
BeanFactory是Spring Bean容器的根类,是容器最基本客户端试图。实现类应该尽可能地支持生命周期函数。
public interface BeanFactory {
// FactoryBean实例前缀
String FACTORY_BEAN_PREFIX = "&";
// 通过bean名称获取bean实例,无论是Singleton还是Prototype。
// 如果是name是别名,会解析为最终的真实名称。
// 如果在本BeanFactory没有找到实例,会询问父BeanFactory查找
// NoSuchBeanDefinitionException、BeansException
Object getBean(String name) throws BeansException;
// 与getBean(String name)基本相同,增加强制类型校验,如果类型异常抛出BeanNotOfRequiredTypeException
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
// 通过给定的参数匹配构造函数或者工厂方法创建给定名称的实例。
Object getBean(String name, Object... args) throws BeansException;
// 按类型获取唯一bean,会涉及primary逻辑,priority逻辑
<T> T getBean(Class<T> requiredType) throws BeansException;
// 通过制定类型和参数,选择特定的构造函数或工厂方法,获取唯一对象。会涉及primary逻辑,priority逻辑
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
// 返回指定类型的提供器,允许延迟后台检索实例,包括可用性和唯一性选项。
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
// 返回匹配类型的实例,可以是泛型类型声明。注意与反射注入点不同,不支持集合类型。
// 为了以编程方式检索匹配特定类型的bean列表,请在这里指定实际的bean类型作为参数,
// 然后使用{@link ObjectProvider#orderedStream()}或它的延迟流/迭代选项
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
// 当前BeanFactory是否包含bean定义或者以给定的name扩展注册的单例
// 如果给点的name是别名,会通过别名系统还原为最原始的bean名称
// 如果是HierarchicalBeanFactory,本BeanFactory没有找到,会从父BeanFactory查询
// 只要BeanDefiniton是定义了的,该方法都会返回ture,无论是concrete or abstract, lazy or eager, in scope or not。
// 因此,并不是本方法返回true就表示getBean就能成功地获取实例
boolean containsBean(String name);
// 如果给点的name是别名,会通过别名系统还原为最原始的bean名称
// 如果是HierarchicalBeanFactory,本BeanFactory没有找到,会从父BeanFactory查询
// 判断给定name的bean是否定义为单例
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
// 如果给点的name是别名,会通过别名系统还原为最原始的bean名称
// 如果是HierarchicalBeanFactory,本BeanFactory没有找到,会从父BeanFactory查询
// 判断给定name的bean是否定义为原型
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
// 检查具有给定名称的bean是否与指定的类型匹配。
// 更具体地说,检查给定名称的getBean调用是否会返回一个可分配给指定目标类型的对象。
// 如果给点的name是别名,会通过别名系统还原为最原始的bean名称
// 如果是HierarchicalBeanFactory,本BeanFactory没有找到,会从父BeanFactory查询
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
// 检查具有给定名称的bean是否与指定的类型匹配。
// 更具体地说,检查给定名称的getBean调用是否会返回一个可分配给指定目标类型的对象。
// 如果给点的name是别名,会通过别名系统还原为最原始的bean名称
// 如果是HierarchicalBeanFactory,本BeanFactory没有找到,会从父BeanFactory查询
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
// 推断指定name的bean的类型。更具体地说,返回getBean(name)对象的类型。
// 对于FactoryBean,返回的FactoryBean创建对象的类型,与FactoryBean#getObjectType()的结果相同
// 可能导致初始化之前为初始化的FactoryBean,参见getType(String, boolean)方法
// 如果给点的name是别名,会通过别名系统还原为最原始的bean名称
// 如果是HierarchicalBeanFactory,本BeanFactory没有找到,会从父BeanFactory查询
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
// 与getType(string)相似,只是指定是否允许FactoryBean初始化
@Nullable
Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;
// 返回指定名称的所有别名信息,如果name是别名,返回原始名和其他笔名,原始名在数组的第一个元素
// 如果是HierarchicalBeanFactory,本BeanFactory没有找到,会从父BeanFactory查询
String[] getAliases(String name);
}
1.1.2、HierarchicalBeanFactory
HierarchicalBeanFactory扩展自BeanFactory,增加了层级结构管理的功能。通过ConfigurableBeanFactory接口中的setParentBeanFactory,允许配置父BeanFactory。
public interface HierarchicalBeanFactory extends BeanFactory {
// 返回当前BeanFactory的父BeanFactory,如果没有返回null
@Nullable
BeanFactory getParentBeanFactory();
// 返回本BeanFactory是否包含指定namne的bean,不考虑祖先BeanFactory
boolean containsLocalBean(String name);
}
1.1.3、AutowireCapableBeanFactory
AutowireCapableBeanFactory是对BeanFactory的扩展,主要增加了自动装配Bean属性依赖的能力。提供多种自动装配策略和细粒度控制装配过程的方法。
// 扩展自动装配功能,常引用与框架集成代码中,用于控制Spring无法控制的现有Bean。
// 注意ApplicationContext未实现该接口,因为应用程序极少用到该类。
// 可以通过ApplicationContext的getAutowireCapableBeanFactory获取到该类实例
// 也可以通过BeanFactoryAware来访问,通过将BeanFactory转换
public interface AutowireCapableBeanFactory extends BeanFactory {
// 常量,指示没有外部定义的自动装配。
// 请注意,BeanFactoryAware等和注释驱动的注入仍然会被应用。
int AUTOWIRE_NO = 0;
// 常量,表示通过name注入bean属性
int AUTOWIRE_BY_NAME = 1;
// 常量,表示通过type注入bean属性
int AUTOWIRE_BY_TYPE = 2;
// 常量,表示通过满足最贪婪构造函数的方式注入(包括解析适当的构造函数)
int AUTOWIRE_CONSTRUCTOR = 3;
// 弃用常量,表明通过bean的类自省推断适当的注入策略
@Deprecated
int AUTOWIRE_AUTODETECT = 4;
// 该属性是一种约定俗成的用法:以类全限定名+.ORIGINAL 作为Bean Name
// 用于告诉Spring,在初始化的时候,需要返回原始给定实例,而别返回代理对象
// initializeBean(Object, String)
// applyBeanPostProcessorsBeforeInitialization(Object, String)
// applyBeanPostProcessorsAfterInitialization(Object, String)
String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL";
//-----------------------------------------------
// 用于创建和填充外部bean实例的典型方法
//-----------------------------------------------
// 完全创建一个值得类的新实例。并执行完的全部初始化,包括所有可用的BeanPostProcessor
// 注意: 这个方法的目的是创建实例,填充注解的字段和方法,以及执行所有的初始化回调。
// 但是并不会执行按name和按类型装配的属性,要达到此目的可以使用createBean(Class, int, boolean)
<T> T createBean(Class<T> beanClass) throws BeansException;
// 通过应用初始化后置回调和bean属性后置处理来填充给定的bean实例。
// 注意:这本质上是为了重新填充注解字段和方法,无论是创建新实例还是反序列化实例。
// 它并不意味着传统的按名称或按类型自动装配属性;使用autowireBeanProperties实现这些目的。
void autowireBean(Object existingBean) throws BeansException;
// 配置给定的原始bean:自动装配bean属性、应用bean属性值、应用setBeanName和setBeanFactory等工厂回调,
// 还应用所有BeanPostProcessor(包括包装给定生bean的处理器)。
// 是initializeBean方法的超集,完全应用了相应Bea