DefaultListableBeanFactory这个类继承自两个部分,分别是BeanFactory和beandefinitionregistry。
接下来从父类到子类,从无到有阅读代码。
一个名字对应多个别名,可以注册、删除等等。
实现AliasRegistry接口,ConcurrentHashMap来保存别名到名字的映射。
checkForAliasCircle检查是否名字是别名的别名,防止互相别名。
synchronized来获得对ConcurrentHashMap的读写。
ConcurrentHashMap的线程安全指的是,它的每个方法单独调用(即原子操作)都是线程安全的,但是代码总体的互斥性并不受控制
retrieveAliases通过获取名字到多个别名的映射,注意别名的别名也属于别名,所以递归调用。
resolveAliases,替换占位符,传入StringValueResolver。
这是beandefinition仓库的接口。存储beanname和对应的beanDefinition。
定义了bean的scope(单例、PROTOTYPE)。
以及角色,包括APPLICATION(用户定义的)、SUPPORT(一般重要)、INFRASTRUCTURE(和用户没关系)。
设置父亲的名字、scope、LazyInit、依赖的bean(初始化前先初始化这些bean)、是否可以被Autowire到其他bean,是否主要的autowire candidate、Factory、ConstructorArgumentValues、MutablePropertyValues、InitMethodName、DestroyMethodName、Abstract(是否要实例化)。
元数据的接口,名字和对应的Object
返回一个配置源。
构造器参数的值,包括下标参数,使用LinkedHashMap来存储。也包括无下标参数,用list来存储。参数是ValueHolder。
addOrMergeIndexedArgumentValue接口使用到Mergeable。
实现BeanMetadataElement接口,是一个参数,记录了value、type、source(配置源)、ConvertedValue。
表示可以合并,还有合并的接口。
实现了PropertyValues接口,还有记录processedProperties的名字。
使用List< processedProperties>。
提供了插入propertyValue和propertyValues的功能,还有合并旧的和新的,需要PropertyValue实现了Mergeable接口。
对比PropertyValues并返回不同的。
继承Iterable,具有迭代器功能,也增加了通过propertyName获取PropertyValue。
BeanDefinition的MutablePropertyValues用到。
继承BeanMetadataAttributeAccessor。
包括name、value、optional、converted、resolvedTokens。
getOriginalPropertyValue,不断追溯source且是PropertyValue类型的。
实现了AttributeAccessor接口,使用一个LinkedHashMap。
继承自AttributeAccessorSupport,实现BeanMetadataElement接口。
BeanMetadataElement的接口定义了一个source,实现类BeanMetadataAttribute包含了name,value,source。AttributeAccessorSupport是name,value对集合。BeanMetadataAttributeAccessor自己有一个source,对应BeanMetadataElement的接口。存向父类AttributeAccessorSupport的value是BeanMetadataAttribute类型,接口包括MetadataAttribute和Attribute,对于Attribute,存的时候把name和value打包成BeanMetadataAttribute,获取的时候再拆分。
实现了BeanMetadataElement接口,包含name,value,source。其中name和value是键值对,source是用来追踪定义源。
单例的bean仓库。
getSingletonMutex用于获取锁。
实现了SingletonBeanRegistry接口,继承SimpleAliasRegistry。是一个分享bean实例的仓库。
earlySingletonObjects存储从factory里获取的实例。
提供增加单例bean的功能,名字到bean,在singletonObjects、registeredSingletons增加记录,删除singletonFactories、earlySingletonObjects里的。
提供增加SingletonFactory,工厂名字和实例名字不能冲突。
factory其实是一个早期引用,可以通过factory获得实例。
inCreationCheckExclusions存储已经创建好实例名字。
还维护了实例是否在创建的状态。
containedBeanMap,key是外部的name,value是内部(被包含)的。
registerDependentBean,外部的是dependentBeanName,beanname是内部的。
dependentBeanMap,key是内部的,value是外部的。
dependenciesForBeanMap,key是外部的,value是内部的
isDependent,是一个dfs算法,alreadySeen是visited。
destroyBean,先开始找外部的类,然后从外部到里面删除。
继承DefaultSingletonBeanRegistry
存储name和factoryBean。
缓存从参数FactoryBean获取的bean。
提供了获取bean,provider(用于延迟加载),获取制定type、参数的bean,使用ResolvableType来表示类型。
getParentBeanFactory返回父节点的beanfactory。
继承自HierarchicalBeanFactory和SingletonBeanRegistry的接口。
设置classloader、bean表达式解析器、ConversionService、PropertyEditorRegistrar、PostProcessor、EmbeddedValueResolver、Scope、AccessControlContext。获得MergedBeanDefinition,registerDependentBean等。
abstract是有些函数是由子类实现。
这个主要是实现ConfigurableBeanFactory。
mergedBeanDefinitions,用到RootBeanDefinition类。
doGetBean先检查单例中有没有,然后检查自己有没有,如果自己没有,则去父类的factorybean检查有没有,没有再转换。
getObjectForBeanInstance,factorybean的name有一个前缀,然后判断beanInstance是factorybean来返回object。
还有一个flag,来表示是否abstract。
scope除了单例和原型,调用