Spring-IOC加载流程
2022-01-29 15:56:08 0 举报
Spring阅读小记
作者其他创作
大纲/内容
返回Bean实例
processConfigurationClass()
isCandidateComponent
保存ImportBeanDefinitionRegistrar对象configClass.addImportBeanDefinitionRegistrar
调用我们bean的后置处理器的PostProcessorsAfterInitialization方法applyBeanPostProcessorsAfterInitialization()
早期对象
不是
标注了@Compent @Repository @Service @Controller 能够被识别解析
parser.parse(candidates)
是
解析属性资源文件@propertySource
初始化bean定义读取器
把解析出来的配置类注册到容器中
返回
判断是否设置了属性赋值
是的话 给beanName+前缀&符号
this()
selector.selectImports()调用方法返回字符串数组反射为Class循环处理
afterPropertiesSet()
processPropertySource(propertySource)
includeFilters
扫描类路径寻找候选组件
getBean(beanName)
通过有参的构造函数进行反射调用autowireConstructor()
candidate.asConfigClass()标记是从哪个配置类中@Import进来的
调用紫的的初始化方法invokeCustomInitMethod()
尝试去缓存中获取对象取到就返回getSingleton(beanName)
判断是不是实现了ImportSelector
BeanUtils.instantiateClass()
processConfigBeanDefinitions(registry)
真正的进行扫描解析
判断有没有被解析过resolved
excludeFilters
configClass.addBeanMethod()
getImports()获取当前配置类@Import导入进来的类
解析别名transformedBeanName(name)
创建我们通过@CompentScan导入进来的bean name的生成器创建我们通过@Import导入进来的bean name的生成器
设置资源加载器
处理@AutoWired相关的
扫描包
lazyInit
属性赋值的时候发现依赖了B
无,看看是不是正在创建
判断是不是完全的配置类带有@Configuration注解的就是完整的并标记一个 “full”用于后续创建cjlib动态代理
refresh()
判断属性注入模型
setResourceLoader(resourceLoader)
有
getSingleton
createBean
解析到@Autowired出现循环依赖
实例化BeancreateBeanInstance()
findCandidateComponents()
doCreateBean
调用没有实现任何优先级接口的
实例化剩余的单实例beanbeanFactory.preInstantiateSingletons()
把标记正在创建的bean从集合中移除afterSingletonCreation(beanName)
扫描包的规则
第一次返回null
发现依赖了Bean A
shouldSkip()
解析@Import
是否有配置类
createBeanInstance
得到当前配置类下所有@Bean的方法retrieveBeanMethodMetadata(sourceClass)
sortPostProcessors()
创建Bean B
去容器中获取 BeanDefinitionRegistryPostProcessor的 bean 的处理器名称getBeanNamesForType()
否
AnnotationConfigApplicationContext
后置处理器
依赖注入
addSingletonFactory
populateBean
scanner.doScan()
有就直接返回
currentRegistryProcessors.add(getBean())
判断是不是实现了ImportBeanDefinitionRegistrar
basePackages.add()
设置的beanName
doGetBean
没有
是否实现InitializingBean接口
获取包路径
registerDefaultFilters()
reader.loadBeanDefinitions(configClasses)
postProcessBeanDefinition()
scanner = new ClassPathBeanDefinitionScanner
实现了延时的ImportSelector
processConfigurationClass()再次当做配置类来解析如果不是配置类会当做Bean定义
register(annotatedClasses)
注册一些配置的后置处理器
解析@Bean
循环依赖
processDeferredImportSelectors()
处理jsr250相关的组件
scanCandidateComponents()
返回原始对象
初始化ClassPath类的bean定义扫描器
加载bean定义
初始化DefaultListableBeanFactory并且赋值给beanFactory
显示的调用 getBean() 获取该对象,然后加入到 currentRegistryProcessors 集合中
判断是不是工厂方法也就是@Bean注解
扫描带有@@Component
generateBeanName
没有酒锁住一级缓存synchronized (this.singletonObjects)标记Bean马上就要被创建beforeSingletonCreation(beanName)
尝试去一级缓存获取
AOP和事务都会在这里生存代理对象
锁住一级缓存synchronized (this.singletonObjects)尝试去二级缓存中获取
处理我们延时的DeferredImportSelectorsspringboot就是通过这步进行自动装配的
invokeBeanDefinitionRegistryPostProcessors()
new ClassPathBeanDefinitionScanner
processCommonDefinitionAnnotations
Aware接口进行方法的回调invokeAwareMethods()
检查是否设置 includeFilters 属性检查是否设置 excludeFilters 属性检查是否设置 lazyInit 属性
new AnnotatedBeanDefinitionReader
实现
冻结所有的 bean 定义 说明注册的 bean 定义将不被修改或任何进一步的处理beanFactory.freezeConfiguration()
isSingletonCurrentlyInCreation(beanName)
把解析出来的组件bean定义注册到的IOC容器中
注册了用于解析我们配置类的后置处理器ConfigurationClassPostProcessor注册了处理@Autowired 注解的处理器AutowiredAnnotationBeanPostProcessor。。。。。。
applyPropertyValues()
停止使用临时ClassLoader进行类型匹配beanFactory.setTempClassLoader(null)
把配置类源信息和beanName包装成一个ConfigurationClass 对象
单独实例化,不会通过getBean()也就是说ImportBeanDefinitionRegistrar不是一个bean
AUTOWIRE_BY_NAME
真正的解析
调用我们的bean的后置处理器的postProcessorsBeforeInitialization方法@PostCust注解的方法applyBeanPostProcessorsBeforeInitialization()
registerAnnotationConfigProcessors()
BeanNameAwareBeanClassLoaderAwareBeanFactoryAware
加入到集合中candidates.add(sbd)
没有实现
把configClass当做一个配置类
直接 return
resolvedAutowireMode
获取到早期对象
invokeBeanFactoryPostProcessors(beanFactory)
解析@ImportprocessImports()
判断是否实有InstantiationAwareBeanPostProcessor后置处理器
从单例缓存池中获取所有的对象getSingleton(beanName)
未完
GenericApplicationContext
返回Bean B
setEnvironment(environment)
调用 bean 工厂的后置处理器
获取包下锁有clss文件
对currentRegistryProcessors集合中的 BeanDefinitionRegistryPostProcessor 进行排序
此时只有一个后置处理器就是 ConfigurationClassPostProcessor
return
获取Bean B
doGetBean()
调用无参数的构造函数进行创建对象instantiateBean()
是否实现了SmartInitializingSingleton接口
创建BeancreateBean()
AUTOWIRE_BY_TYPE
是否实现了DeferredImportSelector
调用初始化方法invokeInitMethods()
调用XXX AwareParserStrategyUtils.invokeAwareMethods
判断是不是工厂bean
根据bean定义判断不是抽象的 && 是单例的 && 不是懒加载的
doRegisterBean()
checkConfigurationClassCandidate()
真正的创建Bean实例doCreateBean()
解析配置类
return instantiateUsingFactoryMethod()
进行对象初始化操作在这里可能生成代理对象initializeBean()
deferredImportSelectors.add
创建Bean A
调用无参构造函数会先调用父类
sbr.getSingleton()
在这里只是缓存了@Bean的方法并没有解析成BeanDefinition
调用后置处理器赋值
解析@ComponentScans
设置环境对象
会在解析完配置后调用processDeferredImportSelectorst()解析
解析@ImportResource
递归处理
触发实例化之后的方法afterSingletonsInstantiated()
从三级缓存中获取返回,并放到二级缓存中
实例化剩余的单例 bean
再调用实现了Ordered接口的后置处理器
解析@Conditional
注册销毁的bean的销毁接口registerDisposableBeanIfNecessary
再次getSingleton(beanName)
componentScanParser.parse()
不是,就直接返回 null
注册配置类
registerBeanDefinition()
属性进行赋值(调用set方法进行赋值)populateBean()
刷新 IOC 容器
finishBeanFactoryInitialization(beanFactory)
收藏
0 条评论
下一页