Spring IOC源码实现
2025-08-11 15:38:30 3 举报
AI智能生成
Spring IOC源码实现
作者其他创作
大纲/内容
FileSystemXmlApplicationContext#FileSystemXmlApplicationContext
AbstractApplicationContext#refresh
获取刷新的BeanFactory
AbstractApplicationContext#obtainFreshBeanFactory
AbstractRefreshableApplicationContext#refreshBeanFactory
这里判断,如果已经建立了BeanFactory,则销毁并关闭该BeanFactory
AbstractApplicationContext#destroyBeans
AbstractRefreshableApplicationContext#closeBeanFactory
AbstractRefreshableApplicationContext#createBeanFactory
BeanDefinition
AbstractRefreshableApplicationContext#loadBeanDefinitions
AbstractXmlApplicationContext#loadBeanDefinitions
XmlBeanDefinitionReader#XmlBeanDefinitionReader
AbstractXmlApplicationContext#initBeanDefinitionReader
AbstractXmlApplicationContext#loadBeanDefinitions
AbstractBeanDefinitionReader#loadBeanDefinitions
BeanDefinition的定位
DefaultResourceLoader#getResource
处理带有classpath标识的Resource
ClassPathResource#ClassPathResource
处理带有URL标识的Resource
FileUrlResource#FileUrlResource(java.net.URL)
UrlResource#UrlResource(java.net.URL)
DefaultResourceLoader#getResourceByPath
子类实现FileSystemXmlApplicationContext#getResourceByPath
FileSystemResource
BeanDefinition的加载和注册
XmlBeanDefinitionReader#loadBeanDefinitions
XmlBeanDefinitionReader#doLoadBeanDefinitions
XmlBeanDefinitionReader#doLoadDocument
DefaultDocumentLoader#loadDocument
XmlBeanDefinitionReader#registerBeanDefinitions
XmlBeanDefinitionReader#createBeanDefinitionDocumentReader
DefaultBeanDefinitionDocumentReader#registerBeanDefinitions
DefaultBeanDefinitionDocumentReader#doRegisterBeanDefinitions
DefaultBeanDefinitionDocumentReader#preProcessXml
DefaultBeanDefinitionDocumentReader#parseBeanDefinitions
DefaultBeanDefinitionDocumentReader#parseDefaultElement
ele=import
DefaultBeanDefinitionDocumentReader#importBeanDefinitionResource
ele=alias
DefaultBeanDefinitionDocumentReader#processAliasRegistration
ele=bean
DefaultBeanDefinitionDocumentReader#processBeanDefinition
BeanDefinitionParserDelegate#parseBeanDefinitionElement
先取得在<bean>元素中定义的id、name和aliase属性的值
BeanDefinitionParserDelegate#parseBeanDefinitionElement
创建 AbstractBeanDefinition 实例
BeanDefinitionParserDelegate#createBeanDefinition
BeanDefinitionReaderUtils#createBeanDefinition
解析属性(如 scope、autowire)
BeanDefinitionParserDelegate#parseBeanDefinitionAttributes
对各种<bean>元素的信息进行解析的地方
BeanDefinitionParserDelegate#parseMetaElements
BeanDefinitionParserDelegate#parseLookupOverrideSubElements
BeanDefinitionParserDelegate#parseReplacedMethodSubElements
处理子标签(如 <property>, <constructor-arg>)
BeanDefinitionParserDelegate#parseConstructorArgElements
BeanDefinitionParserDelegate#parsePropertyElements
遍历子元素,如果是property元素则进入
BeanDefinitionParserDelegate#parsePropertyElement
BeanDefinitionParserDelegate#parsePropertyValue
ref元素
RuntimeBeanReference
value元素
TypedStringValue
子元素
BeanDefinitionParserDelegate#parsePropertySubElement
idref
parseIdRefElement
value
parseValueElement
null
TypedStringValue
array
parseArrayElement
list
parseListElement
ManagedList
setSource
setElementTypeName
setMergeEnabled
BeanDefinitionParserDelegate#parseCollectionElements
有element子元素的话继续递归调用parsePropertySubElement
set
parseSetElement
map
parseMapElement
props
parsePropsElement
设置元信息(如描述、资源路径)
setResource
setSource
BeanDefinitionParserDelegate#decorateBeanDefinitionIfRequired
BeanDefinitionParserDelegate#decorateIfRequired
BeanDefinitionReaderUtils#registerBeanDefinition
DefaultListableBeanFactory#registerBeanDefinition
beanDefinitionMap.put(beanName, beanDefinition);
ReaderContext#fireComponentRegistered
ele=beans
DefaultBeanDefinitionDocumentReader#doRegisterBeanDefinitions
BeanDefinitionParserDelegate#parseCustomElement
BeanDefinitionParserDelegate#parseCustomElement
DefaultBeanDefinitionDocumentReader#postProcessXml
进一步完善 BeanFactory,为它的各项成员变量赋值
AbstractApplicationContext#prepareBeanFactory
AbstractBeanFactory#addPropertyEditorRegistrar
AbstractBeanFactory#addBeanPostProcessor
设置BeanFactoy的后置处理
AbstractApplicationContext#postProcessBeanFactory
调用BeanFactory的后处理器,这些后处理器是在Bean定义中向容器注册的
AbstractApplicationContext#invokeBeanFactoryPostProcessors
注册Bean的后处理器,在Bean创建过程中调用
AbstractApplicationContext#registerBeanPostProcessors
对上下文中的消息源进行初始化
AbstractApplicationContext#initMessageSource
初始化上下文中的事件机制
AbstractApplicationContext#initApplicationEventMulticaster
初始化其他的特殊Bean
AbstractApplicationContext#onRefresh
检查监听Bean并且将这些Bean向容器注册
AbstractApplicationContext#registerListeners
将beanFactory的成员补充完毕,并初始化所有非延迟单例 bean
AbstractApplicationContext#finishBeanFactoryInitialization
AbstractBeanFactory#setTempClassLoader
DefaultListableBeanFactory#freezeConfiguration
DefaultListableBeanFactory#preInstantiateSingletons
AbstractBeanDefinition#isLazyInit
AbstractBeanFactory#getBean
发布容器事件,结束Refresh过程
AbstractApplicationContext#finishRefresh
AbstractApplicationContext#doClose
lifecycleProcessor != null
DefaultLifecycleProcessor#onClose
AbstractApplicationContext#destroyBeans
DefaultSingletonBeanRegistry#destroySingletons
DefaultSingletonBeanRegistry#destroySingleton
DefaultSingletonBeanRegistry#destroyBean
DisposableBeanAdapter#destroy
DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
DisposableBean#destroy
DisposableBeanAdapter#invokeCustomDestroyMethod
AbstractRefreshableApplicationContext#closeBeanFactory
AbstractRefreshableApplicationContext#onClose
获取bean
AbstractBeanFactory#getBean
AbstractBeanFactory#doGetBean
DefaultSingletonBeanRegistry#getSingleton
DefaultSingletonBeanRegistry#getSingleton(beanName, allowEarlyReference true)
this.singletonObjects.get(beanName)
this.earlySingletonObjects.get(beanName)
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
this.earlySingletonObjects.put(beanName, singletonObject)
是共享实例
AbstractBeanFactory#getObjectForBeanInstance
FactoryBeanRegistrySupport#getObjectFromFactoryBean
FactoryBeanRegistrySupport#doGetObjectFromFactoryBean
factory.getObject()
不是共享实例
getParentBeanFactory()
AbstractBeanFactory#getMergedLocalBeanDefinition
DefaultSingletonBeanRegistry#registerDependentBean
AbstractAutowireCapableBeanFactory#createBean
AbstractBeanFactory#resolveBeanClass
mbd.getBeanClass()
AbstractBeanFactory#doResolveBeanClass
ClassUtils#forName
AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
BeanPostProcessor#postProcessAfterInitialization
AbstractAutowireCapableBeanFactory#doCreateBean
实例化bean对象
AbstractAutowireCapableBeanFactory#createBeanInstance
AbstractBeanFactory#resolveBeanClass
AbstractAutowireCapableBeanFactory#obtainFromSupplier
AbstractAutowireCapableBeanFactory#instantiateUsingFactoryMethod
AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors
SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors
AutowiredAnnotationBeanPostProcessor#determineCandidateConstructors
AbstractAutowireCapableBeanFactory#autowireConstructor
先检查是否指定了具体的构造方法和构造方法参数值,或者在BeanDefinition中缓存了具体的构造方法或构造方法参数值,如果存在那么则直接使用该构造方法进行实例化
如果没有确定的构造方法或构造方法参数值,那么
如果没有确定的构造方法,那么则找出类中所有的构造方法
如果只有一个无参的构造方法,那么直接使用无参的构造方法进行实例化
如果有多个可用的构造方法或者当前Bean需要自动通过构造方法注入
根据所指定的构造方法参数值,确定所需要的最少的构造方法参数值的个数
对所有的构造方法进行排序,参数个数多的在前面
遍历每个构造方法
如果不是调用getBean方法时所指定的构造方法参数值,那么则根据构造方法参数类型找值
如果时调用getBean方法时所指定的构造方法参数值,就直接利用这些值
如果根据当前构造方法找到了对应的构造方法参数值,那么这个构造方法就是可用的,但是不一定这个构造方法就是最佳的,所以这里会涉及到是否有多个构造方法匹配了同样的值,这个时候就会用值和构造方法类型进行匹配程度的打分,找到一个最匹配的
推断构造方法
推断构造方法不同情况总结图
没有加了@Autowired注解的构造方法
有多个构造方法
返回null
只有一个有参的构造方法
返回此构造方法
只有一个无参的构造方法
返回null
存在加了@Autowired注解的构造方法
只有一个required为true的构造方法
返回此构造方法
有多个required为true的构造方法
抛异常
有一个required为true和其他的required为false的构造方法
抛异常
没有required为true的构造方法
返回所有required为false的构造方法以及无参构造方法
AbstractAutowireCapableBeanFactory#instantiateBean
SimpleInstantiationStrategy#instantiate
没有重写方法
取得指定的构造器或者生成对象的工厂方法来对Bean进行实例化
BeanUtils#instantiateClass
Constructor#newInstance
有重写方法
CglibSubclassingInstantiationStrategy#instantiateWithMethodInjection
CglibSubclassingInstantiationStrategy#instantiateWithMethodInjection
CglibSubclassCreator#instantiate
CglibSubclassCreator#createEnhancedSubclass
Constructor#newInstance
AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors
MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()
AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition
AutowiredAnnotationBeanPostProcessor#findAutowiringMetadata
遍历当前类的所有的属性字段Field
查看字段上是否存在@Autowired、@Value、@Inject中的其中任意一个,存在则认为该字段是一个注入点
如果字段是static的,则不进行注入
获取@Autowired中的required属性的值
将字段信息构造成一个AutowiredFieldElement对象,作为一个注入点对象添加到currElements集合中。
遍历当前类的所有方法Method
判断当前Method是否是桥接方法,如果是找到原方法
查看方法上是否存在@Autowired、@Value、@Inject中的其中任意一个,存在则认为该方法是一个注入点
如果方法是static的,则不进行注入
获取@Autowired中的required属性的值
将方法信息构造成一个AutowiredMethodElement对象,作为一个注入点对象添加到currElements集合中。
遍历完当前类的字段和方法后,将遍历父类的,直到没有父类。
最后将currElements集合封装成一个InjectionMetadata对象,作为当前Bean对于的注入点集合对象,并缓存。
循环引用解决,对象放入三级缓存
earlySingletonExposure
DefaultSingletonBeanRegistry#addSingletonFactory
this.getEarlyBeanReference(beanName, mbd, bean)
AbstractAutowireCapableBeanFactory#getEarlyBeanReference
AbstractAutoProxyCreator#getEarlyBeanReference
Object cacheKey = this.getCacheKey(bean.getClass(), beanName)
this.earlyProxyReferences.put(cacheKey, bean)
earlyProxyReferences也可以视为四级缓存,用来记录某个原始对象是否进行过AOP了
AbstractAutoProxyCreator#wrapIfNecessary(bean, beanName, cacheKey)
属性赋值,依赖注入
AbstractAutowireCapableBeanFactory#populateBean
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation()
AbstractBeanDefinition#getPropertyValues
AbstractBeanDefinition#getResolvedAutowireMode
resolvedAutowireMode == 1 || resolvedAutowireMode == 2
resolvedAutowireMode == 1
AbstractAutowireCapableBeanFactory#autowireByName
AbstractBeanFactory#getBean
DefaultSingletonBeanRegistry#registerDependentBean
resolvedAutowireMode == 2
AbstractAutowireCapableBeanFactory#autowireByType
AbstractAutowireCapableBeanFactory#unsatisfiedNonSimpleProperties
BeanWrapperImpl#getPropertyDescriptor
BeanUtils#getWriteMethodParameter
DependencyDescriptor desc = new AutowireByTypeDependencyDescriptor(methodParam, eager)
DefaultListableBeanFactory#resolveDependency
DependencyDescriptor#initParameterNameDiscovery
DependencyDescriptor#getDependencyType
Optional.class
DefaultListableBeanFactory#createOptionalDependency
ObjectFactory.class
ObjectProvider.class
ObjectProvider.class
new DependencyObjectProvider
DefaultListableBeanFactory#doResolveDependency
DefaultListableBeanFactory#resolveMultipleBeans
DefaultListableBeanFactory#findAutowireCandidates
找出BeanFactory中类型为type的所有的Bean的名字,注意是名字,而不是Bean对象,因为我们可以根据BeanDefinition就能判断和当前type是不是匹配,不用生成Bean对象
把resolvableDependencies中key为type的对象找出来并添加到result中
遍历根据type找出的beanName,判断当前beanName对应的Bean是不是能够被自动注入
先判断beanName对应的BeanDefinition中的autowireCandidate属性,如果为false,表示不能用来进行自动注入,如果为true则继续进行判断
判断当前type是不是泛型,如果是泛型是会把容器中所有的beanName找出来的,如果是这种情况,那么在这一步中就要获取到泛型的真正类型,然后进行匹配,如果当前beanName和当前泛型对应的真实类型匹配,那么则继续判断
如果当前DependencyDescriptor上存在@Qualifier注解,那么则要判断当前beanName上是否定义了Qualifier,并且是否和当前DependencyDescriptor上的Qualifier相等,相等则匹配
经过上述验证之后,当前beanName才能成为一个可注入的,添加到result中
AbstractBeanFactory#hasInstantiationAwareBeanPostProcessors
hasInstAwareBpps
如果存在,会在 Bean 实例化之前和之后调用对应的回调方法,在 Bean 实例化之前和之后进行干预
InstantiationAwareBeanPostProcessor#postProcessProperties
AbstractBeanDefinition#getDependencyCheck
AbstractAutowireCapableBeanFactory#checkDependencies
AbstractAutowireCapableBeanFactory#applyPropertyValues
使用BeanDefinitionResolver来对BeanDefinition进行解析
BeanDefinitionValueResolver#resolveValueIfNecessary
BeanDefinitionValueResolver#resolveReference
RuntimeBeanReference#getBeanName
从RuntimeBeanReference取得reference的名字,这个RuntimeBeanReference是在载入BeanDefinition时根据配置生成的
如果ref是在双亲IoC容器中,那就到双亲IoC容器中去获取
AbstractBeanFactory#getBean
在当前IOC容器中去获取Bean,这里会触发一个getBean的过程,如果依赖注入没有发生,这里会触发相应的依赖注入的发生
DefaultSingletonBeanRegistry#registerDependentBean
resolveInnerBean
resolveManagedArray
resolveManagedList
resolveManagedSet
resolveManagedMap
resolveTargetType
注入到property中
依赖注入实际发生的地方
依赖注入实际发生的地方
AbstractPropertyAccessor#setPropertyValues
AbstractNestablePropertyAccessor#setPropertyValue
AbstractNestablePropertyAccessor#setPropertyValue
tokens.keys != null
AbstractNestablePropertyAccessor#processKeyedProperty
AbstractNestablePropertyAccessor#getPropertyHoldingValue
设置tokens的索引和keys
AbstractNestablePropertyAccessor#getPropertyValue
对Array进行注入
Array.set(propValue, arrayIndex, convertedValue);
对List进行注入
list.add(convertedValue);
对Map进行注入
map.put(convertedValue, newArray);
tokens.keys = null
AbstractNestablePropertyAccessor#processLocalProperty
BeanWrapperImpl#getLocalPropertyHandler
BeanPropertyHandler#setValue
Method#invoke
初始化bean
AbstractAutowireCapableBeanFactory#initializeBean
Aware回调
AbstractAutowireCapableBeanFactory#invokeAwareMethods
BeanNameAware
setBeanName()
BeanClassLoaderAware
setBeanClassLoader()
BeanFactoryAware
((BeanFactoryAware)bean).setBeanFactory(this)
初始化前
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
InitDestroyAnnotationBeanPostProcessor#postProcessBeforeInitialization
ApplicationContextAwareProcessor#postProcessBeforeInitialization
ApplicationContextAwareProcessor#invokeAwareInterfaces
EnvironmentAware
EmbeddedValueResolverAware
ResourceLoaderAware
ApplicationEventPublisherAware
MessageSourceAware
ApplicationStartupAware
ApplicationContextAware
初始化
AbstractAutowireCapableBeanFactory#invokeInitMethods
是否实现了InitializingBean接口
afterPropertiesSet
是否实现了自定义的初始化方法
AbstractAutowireCapableBeanFactory#invokeCustomInitMethod
初始化后
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
AbstractAutoProxyCreator#postProcessAfterInitialization
当前对象在earlyProxyReferences中,则表示已经提前进行过AOP,无需再进行AOP了
Bean就是代理类所实例化得到的对象,而不是类本身所得到的对象
否则需要进行AOP
AbstractAutoProxyCreator#wrapIfNecessary
Bean就是类的构造方法所得到的对象
AbstractBeanFactory#getObjectForBeanInstance
FactoryBeanRegistrySupport#getObjectFromFactoryBean
FactoryBeanRegistrySupport#doGetObjectFromFactoryBean
factory.getObject()
AbstractBeanFactory#adaptBeanInstance
0 条评论
下一页