Spring源码详解
2021-06-30 22:54:44 0 举报
AI智能生成
Spring源码脑图
作者其他创作
大纲/内容
refresh()
prepareRefresh()
obtainFreshBeanFactory()
若使用xml的上下文ClassPathXmlApplicationContext解析成beanDefinition在这里进行
prepareBeanFactory(beanFactory)
postProcessBeanFactory(beanFactory)
invokeBeanFactoryPostProcessors()
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())
1. BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
调用使用API添加的
调用实现了PriorityOrdered接口的
ConfigurationClassPostProcessor
postProcessBeanDefinitionRegistry(registry)
processConfigBeanDefinitions(registry)
ConfigurationClassUtils.checkConfigurationClassCandidate()
全配置: FullConfigurationClass全配置类: 类上标注为@Configuration注解, 则为全配置类, 标识为full
半配置: LiteConfigurationClass半配置类: 存在@Component, @ComponentScan, @Import, @ImportResource, @Bean之一, 则为半配置类, 标识为lite
do while循环解析到未解析过的配置类
parser.parse(candidates)
新的配置类有可能先注册了beanDefinition, 而并没有解析配置信息, 便是漏网之鱼
如@ImportResource或Registar注册了新的配置类
parser.parse(candidates)
新的配置类有可能先注册了beanDefinition, 而并没有解析配置信息, 便是漏网之鱼
如@ImportResource或Registar注册了新的配置类
parse(metadata, beanName)
processConfigurationClass(configClass)
do while循环解析
doProcessConfigurationClass(configClass, sourceClass)
doProcessConfigurationClass(configClass, sourceClass)
processPropertySource(propertySource)
解析@ComponentScan和@Component
scannedBeanDefinitions =
this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName())
this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName())
扫描的类生成beanDefinition放到beanDefinitionMap中
typeFiltersFor(filter)
scanner.addIncludeFilter(typeFilter)
根据用户配置的FilterType枚举找到TypeFilter实现类往scanner添加includeFilter
typeFiltersFor(filter)
scanner.addExcludeFilter(typeFilter)
根据用户配置的FilterType枚举找到TypeFilter实现类往scanner添加excludeFilter
scanner.doScan(StringUtils.toStringArray(basePackages))
Set<BeanDefinition> candidates = findCandidateComponents(basePackage)
scanCandidateComponents(basePackage)
第一层过滤: isCandidateComponent(metadataReader)
excludeFilter匹配, 表示不匹配直接结束, 返回false
includeFilter匹配且若存在@Conditional条件也应匹配, 才返回true
第二层过滤: isCandidateComponent(sbd)
非抽象类或者抽象类但应该有@Lookup注解
parse(className, beanName)
processConfigurationClass(configClass)
递归调用会解析配置类的开头
processImports(configClass, currentSourceClass, importCandidates, checkForCircularImports)
@Import引入的是普通类, 会当做配置类递归进行解析, 在递归解析前会把这个配置类的importedBy属性添加当前导入他的配置类, 此时还未生成beanDefinition
@Import引入的是@ImportSelector时, 直接实例化, 根据返回的字符串转为Class, 继续解析
ImportSelector子类
processImports(configClass, currentSourceClass, importCandidates, checkForCircularImports)
递归调用解析
ImportBeanDefinitionRegistrar子类
只加入到当前配置类的成员变量importBeanDefinitionRegistrars中, 还不解析
普通类
processConfigurationClass(configClass)
普通类回调回解析配置的流程
@Import引入的是@ImportBeanDefinitionRegistrar时, 只加入到当前配置类的成员变量importBeanDefinitionRegistrars中, 里面的bean还未生成beanDefinition
configClass.addImportedResource(resolvedResource, readerClass)
@ImportResource引入的xml文件, 放到当前配置类的成员变量importedResources中, 里面的bean还未生成beanDefinition
retrieveBeanMethodMetadata(sourceClass)
@Bean标注的方法解析成BeanMethod并放到当前配置类的成员变量beanMethods中, 还未生成beanDefinition
this.configurationClasses.put(configClass, configClass)
这个this指的是parser, 意思是每解析一个配置就往configurationClasses中存一个
this.deferredImportSelectorHandler.process()
解析DeferredImportSelector子类, 延迟解析配置类, 所以也是最后面添加到parser的成员变量configurationClasses的, 但仅仅针对以上解析出来的配置中的排序是最后的, 而对于未解析的类有可能依然存在配置类
this.reader.loadBeanDefinitions(configClasses)
loadBeanDefinitionsForConfigurationClass(configClass, trackedConditionEvaluator)
registerBeanDefinitionForImportedConfigurationClass(configClass)
被@Import导入的类, 已经按照配置类的流程解析过了, 但是还没有放到beanDefinitionMap中, 这里放进去
loadBeanDefinitionsForBeanMethod(beanMethod)
把@Bean解析成beanDefinition, 并放到beanDefinitionMap
loadBeanDefinitionsFromImportedResources(configClass.getImportedResources())
把@ImportedResource引入的xml解析成beanDefinition, 放到beanDefinitionMap中, 若存在配置类, 此时未被解析, 会被下个循环parser.parse()方法解析
do while循环解析到未解析过的配置类
loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars())
调用registrar的注册beanDefinition方法, 放到beanDefinitionMap中, 若注册的为配置类, 此时未被解析, 会被下个循环parser.parse()方法解析
do while循环解析到未解析过的配置类
postProcessBeanFactory()
调用实现了Ordered接口的
调用其他BeanDefinitionRegistryPostProcessor
2. BeanFactoryPostProcessor的postProcessBeanFactory方法
BeanDefinitionRegistryPostProcessor
调用使用API添加的
调用实现了PriorityOrdered接口的
调用实现了Ordered接口的
调用其他BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor
调用使用API添加的
调用实现了PriorityOrdered接口的
调用实现了Ordered接口的
调用其他BeanFactoryPostProcessor
registerBeanPostProcessors(beanFactory)
PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this)
添加Spring内置的BeanPostProcessorChecker()
添加实现了PriorityOrdered接口的BeanPostProcessor
添加实现了Ordered接口的BeanPostProcessor
添加常规的BeanPostProcessor
添加实现子接口类型MergedBeanDefinitionPostProcessor
添加Spring内置的ApplicationListenerDetector()
initMessageSource()
initApplicationEventMulticaster()
onRefresh()
registerListeners()
finishBeanFactoryInitialization(beanFactory)
beanFactory.preInstantiateSingletons()
getBean(beanName)
doGetBean(name, null, null, false)
getSingleton(beanName)
getSingleton(beanName, true)
1. singletonObjects: 一级缓存, 用来存储完整的bean, 找到则返回
2. earlySingletonObjects: 二级缓存, 用来存储早期不完整的bean, 解决循环依赖中, 早期暴露bean, 找到则返回
3. singletonFactories: 三级缓存, 存储创建bean的工厂ObjectFactory, 找到则返回getObject()方法返回的对象
sharedInstance = getSingleton(beanName, singletonFactory)
beforeSingletonCreation(beanName)
this.singletonsCurrentlyInCreation.add(beanName)
标识当前这个bean为正在创建
singletonFactory.getObject()
createBean(beanName, mbd, args)
Object bean = resolveBeforeInstantiation(beanName, mbdToUse)
从容器中找到InstantiationAwareBeanPostProcessor并调用postProcessBeforeInstantiation(beanClass, beanName)实例化
找到所有BeanPostProcessor的实现类调用postProcessAfterInitialization(result, beanName)实例化后方法
Object beanInstance = doCreateBean(beanName, mbdToUse, args)
instanceWrapper = createBeanInstance(beanName, mbd, args)
实例化创建出原始bean
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)
调用所有MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition(mbd, beanType, beanName)方法
addSingletonFactory(beanName, singletonFactory)
添加三级缓存singletonFactory为lamada表达式() -> getEarlyBeanReference(beanName, mbd, bean)
populateBean(beanName, mbd, instanceWrapper)
调用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()方法
autowireByName(beanName, mbd, bw, newPvs)
autowireByType(beanName, mbd, bw, newPvs)
调用InstantiationAwareBeanPostProcessor.postProcessProperties()方法
调用InstantiationAwareBeanPostProcessor.postProcessPropertyValues()方法
applyPropertyValues(beanName, mbd, bw, pvs)
exposedObject = initializeBean(beanName, exposedObject, mbd)
invokeAwareMethods(beanName, bean)
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName)
调用所有BeanPostProcessor.postProcessBeforeInitialization(result, beanName)方法
invokeInitMethods(beanName, wrappedBean, mbd)
调用InitializingBean.afterPropertiesSet()方法
invokeCustomInitMethod(beanName, bean, mbd)
调用init-method指定的方法
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)
调用所有BeanPostProcessor.postProcessAfterInitialization(result, beanName)方法
Object earlySingletonReference = getSingleton(beanName, false)
循环依赖中A->B->A, 当A的属性注入完成后, A的实例已经在二级缓存中了, 此时会从二级缓存中拿到A, 后面那个false代表不能再从三级缓存中拿A了
循环依赖A->B->A中的B属于非循环依赖和正常的非循环依赖在这里均获取的为null, 返回的是原始对象
finishRefresh()
收藏
0 条评论
下一页