spring ioc源码阅读

环境配置

  1. git clone https://github.com/spring-projects/spring-framework
  2. 安装jdk8
  3. gradle build,https://github.com/spring-projects/spring-framework/wiki/Build-from-Source
  4. idea打开,https://github.com/spring-projects/spring-framework/blob/master/import-into-idea.md

idea diagrams 类结构图

spring ioc源码阅读_第1张图片
DefaultListableBeanFactory这个类继承自两个部分,分别是BeanFactory和beandefinitionregistry。
接下来从父类到子类,从无到有阅读代码。

AliasRegistry

一个名字对应多个别名,可以注册、删除等等。

SimpleAliasRegistry

实现AliasRegistry接口,ConcurrentHashMap来保存别名到名字的映射。
checkForAliasCircle检查是否名字是别名的别名,防止互相别名。
synchronized来获得对ConcurrentHashMap的读写。

ConcurrentHashMap的线程安全指的是,它的每个方法单独调用(即原子操作)都是线程安全的,但是代码总体的互斥性并不受控制

retrieveAliases通过获取名字到多个别名的映射,注意别名的别名也属于别名,所以递归调用。
resolveAliases,替换占位符,传入StringValueResolver。

BeanDefinitionRegistry

这是beandefinition仓库的接口。存储beanname和对应的beanDefinition。

BeanDefinition

spring ioc源码阅读_第2张图片
定义了bean的scope(单例、PROTOTYPE)。
以及角色,包括APPLICATION(用户定义的)、SUPPORT(一般重要)、INFRASTRUCTURE(和用户没关系)。
设置父亲的名字、scope、LazyInit、依赖的bean(初始化前先初始化这些bean)、是否可以被Autowire到其他bean,是否主要的autowire candidate、Factory、ConstructorArgumentValues、MutablePropertyValues、InitMethodName、DestroyMethodName、Abstract(是否要实例化)。

AttributeAccessor

元数据的接口,名字和对应的Object

BeanMetadataElement

返回一个配置源。

ConstructorArgumentValues

构造器参数的值,包括下标参数,使用LinkedHashMap来存储。也包括无下标参数,用list来存储。参数是ValueHolder。
addOrMergeIndexedArgumentValue接口使用到Mergeable。

ValueHolder

实现BeanMetadataElement接口,是一个参数,记录了value、type、source(配置源)、ConvertedValue。

Mergeable

表示可以合并,还有合并的接口。

MutablePropertyValues

spring ioc源码阅读_第3张图片

实现了PropertyValues接口,还有记录processedProperties的名字。
使用List< processedProperties>。
提供了插入propertyValue和propertyValues的功能,还有合并旧的和新的,需要PropertyValue实现了Mergeable接口。
对比PropertyValues并返回不同的。

PropertyValues

继承Iterable,具有迭代器功能,也增加了通过propertyName获取PropertyValue。

PropertyValue

BeanDefinition的MutablePropertyValues用到。
spring ioc源码阅读_第4张图片继承BeanMetadataAttributeAccessor。
包括name、value、optional、converted、resolvedTokens。
getOriginalPropertyValue,不断追溯source且是PropertyValue类型的。

AttributeAccessorSupport

实现了AttributeAccessor接口,使用一个LinkedHashMap。

BeanMetadataAttributeAccessor

继承自AttributeAccessorSupport,实现BeanMetadataElement接口。
BeanMetadataElement的接口定义了一个source,实现类BeanMetadataAttribute包含了name,value,source。AttributeAccessorSupport是name,value对集合。BeanMetadataAttributeAccessor自己有一个source,对应BeanMetadataElement的接口。存向父类AttributeAccessorSupport的value是BeanMetadataAttribute类型,接口包括MetadataAttribute和Attribute,对于Attribute,存的时候把name和value打包成BeanMetadataAttribute,获取的时候再拆分。

BeanMetadataAttribute

实现了BeanMetadataElement接口,包含name,value,source。其中name和value是键值对,source是用来追踪定义源。

SingletonBeanRegistry

单例的bean仓库。
getSingletonMutex用于获取锁。

DefaultSingletonBeanRegistry

实现了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,先开始找外部的类,然后从外部到里面删除。

FactoryBeanRegistrySupport

继承DefaultSingletonBeanRegistry
存储name和factoryBean。
缓存从参数FactoryBean获取的bean。

BeanFactory

提供了获取bean,provider(用于延迟加载),获取制定type、参数的bean,使用ResolvableType来表示类型。

HierarchicalBeanFactory

getParentBeanFactory返回父节点的beanfactory。

ConfigurableBeanFactory

继承自HierarchicalBeanFactory和SingletonBeanRegistry的接口。
设置classloader、bean表达式解析器、ConversionService、PropertyEditorRegistrar、PostProcessor、EmbeddedValueResolver、Scope、AccessControlContext。获得MergedBeanDefinition,registerDependentBean等。

AbstractBeanFactory

abstract是有些函数是由子类实现。
这个主要是实现ConfigurableBeanFactory。
mergedBeanDefinitions,用到RootBeanDefinition类。
doGetBean先检查单例中有没有,然后检查自己有没有,如果自己没有,则去父类的factorybean检查有没有,没有再转换。
getObjectForBeanInstance,factorybean的name有一个前缀,然后判断beanInstance是factorybean来返回object。
还有一个flag,来表示是否abstract。
scope除了单例和原型,调用

你可能感兴趣的:(spring)