Spring源码(比较全面)
2024-07-18 16:26:19 12 举报
登录查看完整内容
之前发布过一般,没想到新写的没有同步过去,再加上鸽了一段时间,导致之前的版本内容较少,现在把最新的版本发布上去。
作者其他创作
大纲/内容
反射给方法赋值
检查合并之后的RootBeanDefinition是否是抽象的,如果是直接报错
否
bean instanceof FactoryBean
是
return bean;
循环遍历依赖类型和自动注入值(value)的映射
根据field从beanFactory中查到匹配的bean对象
如果需要检查依赖项则需要确保所有公开项是否都已经设置
config != null || isConfigurationCandidate(metadata)
getMergedLocalBeanDefinition合并beanDefinition
告诉子类刷新内部bean工厂
循环遍历方法的入参,创建对象实例resolveDependency()
this.lazyLookup
调用getBean()创建依赖的bean
method处理
createBean()
populateBean()
byName
refresh()
获取beanDefinition的注解元数据
如果当前bean正在创建中则去三级缓存取值或者lambda表达式
getBean(beanName)
获取注解元数据Configuration的信息
遍历configClass.getBeanMethods()执行loadBeanDefinitionsForBeanMethod(beanMethod)
factory instanceof AutowireCapableBeanFactory
value != null
autowiredBeanNames符合注入条件的beanName集合
factory instanceof ConfigurableBeanFactory
resolveDependency()
finishRefresh()发布完成刷新事件
requestingBeanName != null && beanFactory.containsBean(autowiredBeanName)
doGetBean()
beanFactory.preInstantiateSingletons()
return
AbstractBeanFactory.getBean()
找到多个bean
ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry(registry)
获取@Value所指定的值
解析scope注解
applyPropertyValues()
register(AppConfig.class)
getObjectForBeanInstance()
prepareBeanFactory(beanFactory)
循环遍历configClass
检查beanDefinition是否被当做配置类处理过
beanDefinition是否绑定了自己的class没有就把上一步的class设置进去
剩下的BeanPostProcessor如果是MergedBeanDefinitionPostProcessor类型的加入到internalPostProcessors
Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);
看bean在不在单例池(一级缓存)和早期单例池(二级缓存)里面,如果没有就从singletonFactories(三级缓存)里面拿到一个lambda表达式(singletonFactory.getObject)执行得到一个实例,把他放进早期单例池
遍历beanNames
finishBeanFactoryInitialization(beanFactory)
getSingleton()
return bean;
注册给定的BeanPostProcessor bean
报错
注册beanDefinitionthis.reader.loadBeanDefinitions(configClasses)
initializeBean()
有
这里拿到import引入这个类的所有类
遍历所有实现BeanPostProcessor接口的对象,调用postProcessBeforeInitialization()方法
false
registerListeners()
根据type找到所有符合条件的beanName放入candidateNames数组中
加载检查各种环境变量
skip
resolveBeanByName()
trackedConditionEvaluator.shouldSkip(configClass)
非合成bean并且有实例化前的处理器
checkConfigurationClassCandidate()
初始化invokeInitMethods
是否BeanDefinitionRegistryPostProcessor类型
生成bean名称
field处理
把这次循环解析过的ConfigurationClass放入configClasses
getBean()
processConfigBeanDefinitions(registry)
加到configCandidates里面
看是否跳过加载
添加ApplicationListener监听器
// 将以ImportedResources注解方式引入进来的beanDefinition注册 loadBeanDefinitionsFromImportedResources(configClass.getImportedResources());
是否有值
hasBeanMethods(metadata)
当匹配到和期望类型一致的类型时,把依赖的类型解析成对应的对象,再跟期望类型作比较如果一致放入结果map中, break;
!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()
遍历调用所有实现BeanPostProcessor接口的postProcessAfterInitialization方法
如果factory实现了SmartFactoryBean并且调用isEagerInit方法返回true
模版方法,可以覆盖该方法添加特定上下文的刷新工作。在单例实例化之前,在特殊bean的初始化时调用
isConfigurationCandidate(metadata)
getResourceToInject()
postProcessBeanFactory(beanFactory)
遍历所有实现BeanPostProcessor接口的对象,调用postProcessAfterInitialization()方法
parser.parse(candidates)
判断是否是一个factoryBean
autowireResource()
determinePrimaryCandidate()
遍历最新的beanDefinition集合
return skip
@Autowired处理
new AnnotationConfigApplicationContext(AppConfig.class)
resolveFieldValue()
初始化事件组播器
Spring容器初始化
如果又有新的beanDefinition加进来
className == null || beanDef.getFactoryMethodName() != null
构建ConfigurationClassParser
SmartFactoryBean接口的isEagerInit()方法代表这个factoryBean是否需要提前创建对象
解析spring表达式(#{xxx})
如果找到的是beanClass就创建对象
根据bean类型创建单例,原型或者是其他的bean
初始化
String strVal = resolveEmbeddedValue((String) value);
遍历autowiredBeanNames
doCreateBean()
doResolveDependency()
是否是字段
遍历candidateNames数组,过滤出不是自身引用的,有资格作为自动注入的对象
getMergedLocalBeanDefinition(beanName)
((InitializingBean) bean).afterPropertiesSet()
有@Order注解则拿到排序值并设置到beanDefinition属性里面
metadata.isInterface()是否是接口
将ApplicationListenerDetector注册到bean处理器链的末端
getResource()
所有懒加载单例bean创建之后调用实现SmartInitializingSingleton接口的afterSingletonsInstantiated方法
将ImportRegistry注册为bean以支持ImportAware @Configuration类
是否执行过实例化前操作
处理实现了BeanFactoryPostProcessor接口并且processedBeans中没有的类
执行所有实现InstantiationAwareBeanPostProcessor接口的处理器
遍历所有实现InstantiationAwareBeanPostProcessor接口的postProcessAfterInstantiation方法
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext))
注册过的加到alreadyParsed.addAll(configClasses)
遍历注册过的beanDefinitionName
createBeanInstance()实例化
isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod(\"afterPropertiesSet\"))
自己定义了属性就用自己的,自己没定义就把父类的拿过来合并
invokeBeanFactoryPostProcessors(beanFactory)
isFactoryBean(beanName)
属性填充(依赖注入)
initMessageSource()
分别根据PriorityOrdered、Ordered、普通registry 分组,组内排序, 调用postProcessBeanDefinitionRegistry()
是InitializingBean类型的并且(beanDefinition不为空或者不包含afterPropertiesSet成员)
遍历configClass.getImportedBy()
registryProcessor.postProcessBeanDefinitionRegistry(registry)
this.fallbackToDefaultTypeMatch && element.isDefaultName && !factory.containsBean(name)
解析Primary、Lazy等注解信息
是否需要延迟注入
findAutowireCandidates()
占位符填充(${xxx})
resolveBeanClass()获取beanClass
@Resource处理
spring自带的依赖注入 @Bean注解里面有一个autowired属性指定值就会走这个逻辑。把所有的set方法找出来根据set参数的类型或者set后面的当作名字找bean
将实例化过的标记设为(bean != null)
resolveBeforeInstantiation()
initApplicationEventMulticaster()
检查工厂中是否存在beanDefinition
true
将scope放入beanDefinition
configClasses里面移除注册过的
skipped.get(configClass)==null
config != null && !Boolean.FALSE.equals(config.get(\"proxyBeanMethods\"))
determineAutowireCandidate()
标记当前bean正在创建中
registerBeanPostProcessors(beanFactory)
调用scanner.scan()方法扫描 把类解析成beanDefinition
如果结果是nullbean并且这个属性是必须注入的则报错
这些注解是lite配置类
创建bean
是否有Lazy注解
判断是否是一个配置类
beanFactory的后置处理
初始化前applyBeanPostProcessorsBeforeInitialization
实例化非懒加载单例bean
根据Conditional注解决定是否跳过
实现SmartInitializingSingleton
transformedBeanName()
resolveMethodArguments()
加到candidates
prepareRefresh()
实例化前
buildLazyResourceProxy()
拿到的sharedInstance是否为空
确定给定bean的目标类型
构建延迟对象
obtainFreshBeanFactory()
bean实例化
检测当前bean是否在创建中
最后看这个类有没有带有@Bean注解的方法
configClasses.removeAll(alreadyParsed)
反射字段赋值
对所有的internalPostProcessors进行排序, 然后注册
configCandidates.isEmpty()
调用BeanFactoryPostProcessor的postProcessBeanFactory()方法
getSingleton(beanName)
checkConfigurationClassCandidate()检查是否是一个配置类的候选
smartSingleton.afterSingletonsInstantiated()
registry.getBeanDefinitionCount() > candidateNames.length
这种情况需要生成代理配置类(full类型的配置类)
是否是Component,ComponentScan,Import,ImportResource注解
按照@Order注解升序
循环遍历beanFactoryPostProcessors
设置将来要使用的beanFactory
实例化后属性注入前调用所有实现MergedBeanDefinitionPostProcessor接口的postProcessMergedBeanDefinition方法
1.把所要依赖的Depends都拿出来看是否都创建了bean。2.并检测是否出现循环依赖。3.将beanName和dependsOn里面需要依赖的bean映射到缓存map中
lite类型的配置类
生成一个代理对象
执行初始化后流程
bean的销毁逻辑
循环遍历所有实现了InstantiationAwareBeanPostProcessor接口的对象,调用postProcessProperties()方法
beanFactory instanceof BeanDefinitionRegistry
有返回值
// ImportBeanDefinitionRegistrar由parse()方法解析时放入该map // 调用该类的registerBeanDefinitions方法 loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars());
addCandidateEntry()将对象放入结果map
!candidates.isEmpty()
设置aware回调参数
是否是Import进来的
skip == null
candidates.clear()
1.不在旧的集合里面2.是配置候选类3.不在已经解析过的beanDefinition集合中
注册beanDefinition
determineHighestPriorityCandidate()
onRefresh()
初始化后applyBeanPostProcessorsAfterInitialization
处理完成之后的bean加到processedBeans里面
如果this.metadataReaderFactory是CachingMetadataReaderFactory类型的,清除外部提供的MetadataReaderFactory中的缓存;这是一个无操作的共享缓存,因为它将被ApplicationContext清除。
如果结果数组为空
0 条评论
回复 删除
下一页