在 深入剖析 Spring 核心数据结构:BeanDefinition 中,介绍了 BeanDefinition 。网上很多文章介绍 BeanDefinition 的 API,D瓜哥却要反其道而行之,从内部属性来分析一下。下面我们开始。
Spring 非常好地遵循了面向对象的设计原则:面向接口编程。不放过任何可以提取出成接口的机会。虽然感觉似乎增加了类的继承关系,增加了一点的复杂度。但是,却带来了非常好的可扩展性。而 BeanFactory 的继承体系就是一个非常典型的例子。我们来看一下它的继承体系:
Figure 1. BeanFactory 继承体系
AliasRegistry :别名注册器。Spring 中,别名注册相关的功能就是从这里实现的。
SimpleAliasRegistry :别名注册器的一个简单实现,从内部属性可以看出,它是把别名映射信息存到一个 Map 中了。
DefaultSingletonBeanRegistry :默认的单例 Bean 注册器,从内部属性来说,也是基于 Map 实现的。
FactoryBeanRegistrySupport : FactoryBean 注册器。
SingletonBeanRegistry :单例 Bean 注册器。
BeanDefinitionRegistry : BeanDefinition 注册器。
BeanFactory :容器的基类。
ListableBeanFactory :在基本容器基础上,增加了遍历相关功能。
HierarchicalBeanFactory :在基本容器基础上,增加了父子上下级容器关联。
AutowireCapableBeanFactory :在基本容器基础上,增加了自动注入功能。
ConfigurableBeanFactory :对容器增加可配置性,比如父级容器、 ClassLoader 、 TypeConverter 等。
ConfigurableListableBeanFactory :可配置可遍历容器。
AbstractBeanFactory :容器的抽象实现类,实现了容器的基础功能。
AbstractAutowireCapableBeanFactory :带自动装配功能的抽象容器类。
DefaultListableBeanFactory :这是 Spring 内部使用的默认容器实现。也是 Spring 中最重要的一个类。
Map<String, String> aliasMap = new ConcurrentHashMap<>(16) :别名到 Bean 名称的映射。
Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256) :Bean 名称到单例 Bean 的映射。可以理解成,这就是所谓的容器。
Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16) :Bean 名称到 Bean 的 ObjectFactory 对象的映射,在容器解决循环依赖时,用于存储中间状态。
Map<String, Object> earlySingletonObjects = new HashMap<>(16) :Bean 到“未成熟”单例 Bean 的映射。该 Bean 对象只是被创建出来,但是还没有注入依赖。在容器解决循环依赖时,用于存储中间状态。
Set<String> registeredSingletons = new LinkedHashSet<>(256) :已经被注册过的 Bean 名称集合。
Set<String> singletonsCurrentlyInCreation = Collections.newSetFromMap(new ConcurrentHashMap<>(16)) :正在创建的 Bean 名称集合。
Set<String> inCreationCheckExclusions = Collections.newSetFromMap(new ConcurrentHashMap<>(16)) :不需要检查的正在创建的 Bean 名称集合。
Set<Exception> suppressedExceptions :存储创建过程中发现的异常。
boolean singletonsCurrentlyInDestruction = false :是否正在销毁单例 Bean。
Map<String, Object> disposableBeans = new LinkedHashMap<>() :丢弃的 Bean。
Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<>(16) :在 Bean 名称之间包含映射:Bean 名称到 Bean 所包含的一组 Bean 名称。
Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<>(64) :Bean 名称到它所依赖的 Bean 直接的映射。
Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<>(64) :被依赖的 Bean 到需要这个 Bean 的映射。与 dependentBeanMap 属于一正一反的关系。两个相加,就是双向映射。
Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap<>(16) :由 FactoryBean 创建的单例对象的缓存。
BeanFactory BeanFactory parentBeanFactory :父容器。
ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader() :类加载器。
ClassLoader tempClassLoader :临时类加载器。
BeanExpressionResolver beanExpressionResolver :Bean 定义值中表达式的解析策略。
ConversionService conversionService : Spring 3.0 以后出现,用于类型转换,用于替代 PropertyEditors 。
Set<PropertyEditorRegistrar> propertyEditorRegistrars = new LinkedHashSet<>(4) :属性编辑器注册器集合。
Map<Class<?>, Class<? extends PropertyEditor>> customEditors = new HashMap<>(4) :类型到自定义的属性编辑器的映射。
TypeConverter typeConverter :类型转换器,用于覆盖默认的 PropertyEditor 机制。
List<StringValueResolver> embeddedValueResolvers = new CopyOnWriteArrayList<>() :内置的字符串值解析器列表。
List<BeanPostProcessor> beanPostProcessors = new BeanPostProcessorCacheAwareList() : BeanPostProcessor 列表。关于它的内容,在 Spring Bean 生命周期概述 中有详细地介绍。
BeanPostProcessorCache beanPostProcessorCache : BeanPostProcessor 缓存,会根据类型,缓存到不同的列表中。
Map<String, Scope> scopes = new LinkedHashMap<>(8) : scope 字符串到具体 Scope 实例的映射。
Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap<>(256) :Bean 名称到 RootBeanDefinition 的映射。
Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<>(256)) : 已经创建的 Bean 名称。
ThreadLocal<Object> prototypesCurrentlyInCreation = new NamedThreadLocal<>("Prototype beans currently in creation") :正常创建的 Bean。
InstantiationStrategy instantiationStrategy :Bean 实例创建策略。
ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer() :方法参数名的解析策略。
boolean allowCircularReferences = true :是否循环依赖。
boolean allowRawInjectionDespiteWrapping = false :在循环引用的情况下,是否注入原始 Bean 实例,即使注入的 Bean 最终被包装。
Set<Class<?>> ignoredDependencyTypes = new HashSet<>() :忽略的依赖类型。
Set<Class<?>> ignoredDependencyInterfaces = new HashSet<>() :忽略的依赖接口。
NamedThreadLocal<String> currentlyCreatedBean = new NamedThreadLocal<>("Currently created bean") :正在创建的 Bean。
ConcurrentMap<String, BeanWrapper> factoryBeanInstanceCache = new ConcurrentHashMap<>() :工厂 Bean 实例。
ConcurrentMap<Class<?>, Method[]> factoryMethodCandidateCache = new ConcurrentHashMap<>() :工厂方法缓存。
ConcurrentMap<Class<?>, PropertyDescriptor[]> filteredPropertyDescriptorsCache = new ConcurrentHashMap<>() :过滤后的 PropertyDescriptor 缓存。
Map<String, Reference<DefaultListableBeanFactory>> serializableFactories = new ConcurrentHashMap<>(8) :可序列化的 DefaultListableBeanFactory 。
boolean allowBeanDefinitionOverriding = true :是否运行 BeanDefinition 覆盖。
boolean allowEagerClassLoading = true :是否允许类急切加载。
Comparator<Object> dependencyComparator :依赖排序器。
AutowireCandidateResolver autowireCandidateResolver = SimpleAutowireCandidateResolver.INSTANCE :注入候选者解析器。
Map<Class<?>, Object> resolvableDependencies = new ConcurrentHashMap<>(16) :依赖类型到合适的注入对象的映射。
Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256) :Bean 名称到 BeanDefinition 的映射。关于 BeanDefinition 在 深入剖析 Spring 核心数据结构:BeanDefinition 有更详细的介绍。
Map<String, BeanDefinitionHolder> mergedBeanDefinitionHolders = new ConcurrentHashMap<>(256) :Bean 名称到 BeanDefinitionHolder 的映射。
Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64) :类型到所有该类型的 Bean 名称的映射。
Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<>(64) :类型到所有该类型的单例 Bean 名称的映射。
List<String> beanDefinitionNames = new ArrayList<>(256) :Bean 名称列表。
Set<String> manualSingletonNames = new LinkedHashSet<>(16) :
String[] frozenBeanDefinitionNames :冻结的 Bean 名称。
boolean configurationFrozen :配置是否冻结。
从上面这些属性可以看出,所谓的容器,其实就是一个 Map 属性 Map<String, Object> singletonObjects 。而 Bean 别名也是一个 Map 属性 Map<String, String> aliasMap 。从别名到 Bean 实例只需要做两个 Map 查找就可以完成了。
在网上查了查资料,没有对这些属性做比较详细的介绍,这个文章也有很多不完善的地方,回头随着 D瓜哥对 Spring 代码的了解后续再逐步完善。