并发请求控制
2020-10-26 10:05:20 0 举报
spring
作者其他创作
大纲/内容
从缓存中获取之前解析的构造方法和构造参数
之前解析过
否
根据自动装配模式自动装配Bean,默认为不自动装配
finishBeanFactoryInitialization遍历beanName进行getBean,开始创建
autowireConstructor自动注入构造方法
调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition用以解析class中的@Autowire和@Value注解,核心类是AutowiredAnnotationBeanPostProcessor
单例
通过反射注入依赖
单例作用域
首先排除自身依赖,且获取的beanName能够自动注入
无
完成单例bean的创建
doGetBean方法来获取Bean,首先从缓存中获取,获取不到则根据作用域进行不同的创建方式
计算差异分,获取差异分最小的构造方法
原型作用域下,出现循环依赖则抛出异常
执行实例化前的InstantiationAwareBeanPostProcessor后处理器
从给属性描述符的shortcut中获取,也就是从缓存中获取
注入的依赖是集合bean
通过getDeclardConstructor()方法获取无参构造方法来创建实例
仅有一个匹配
是否为懒加载
回到beanFactory.resolveDependency方法,交给bean工厂完成依赖的解析
是
有参
调用InstantiationAwareBeanPostProcessor的postProcessProperties和postProcessPropertyValues用以获取注入的属性,核心是AutowiredAnnotationBeanPostProcessor
getSingleton从缓存中获取bean,利用三级缓存解决循环依赖
createBean完成BeanDefinition的转换,方法覆盖属性设置
宽大模式则分三个等级,如果和转换后的不匹配,则返回int的max。如果和原本的类型不匹配则返回int.max-512.不然返回int.max-1024
直接注入
AutowiredAnnotationBeanPostProcessor#postProcessProperties完成@Autowire和@Value注解属性的注入
调用findAutowireCandidates找到匹配的bean
标记Bean为创建中
执行Aware接口
如果当前允许循环依赖,则将bean实例放入三级缓存中
依赖检查
先按照是否为public作用域排序,如果都是public则根据参数个数升序排序。
无法找到注入的bean,则进行备选方案,如果备选方案也无法获取到bean,则允许自身依赖,看能不能不能获取到依赖对象
缓存解析结果,反射创建实例,返回BeanWrapper
开始初始化bean
依赖更新,initializeBean方法可能会产生一个代理Bean,所以要更新依赖关系
调用默认无参构造
反射调用初始化方法init-method
isAutowireCandidate会获取BeanDefinition,然后调用getBean去创建依赖对象
调用BeanPostProcessor的postProcessAfterInitialization完成初始化后的后处理器的调用
严格模式
处理Bean的DependsOn属性,先生成依赖Bean
根据注入的bean的类型获取所有的beanName
执行AutowiredFieldElement和AutowiredMethodElement的inject方法完成属性注入
从工厂方法中创建bean(Supplier接口、factroyMethod),
开始注入属性
调用findAutowireCandidates获取符合的bean,然后转换为集合类进行注入
refresh方法开始
doCreateBean开始创建Bean
BeanDefinition是否存在于当前容器,如果存在于父容器则交给父容器处理
当前容器存在BeanDefinition
如果目标构造参数个数和当前构造方法参数个数相同则计算差异分。差异分按照参数类型进行计算。如果是完全相等,则差异分为0,如果是超类则+2,如果是接口则+1。
调用applyPropertyValues完成property属性注入
createBeanInstance创建实例对象
是否只有一个构造参数
返回代理对象
存在
处理@Value注解
调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation完成实例化后的后处理器
直接反射创建实例
调用BeanPostProcessor的postProcessBeforeInitialization完成初始化前的后处理器的调用
缓存中获取成功,则调用getObjectForBeanInstance来完成bean实例的获取,处理FactoryBean
不存在
注册销毁bean方法,也就是DestructionAwareBeanPostProcessor接口后处理器
doGetBean开始创建Bean
无参构造
有
调用SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors来确定构造方法
0 条评论
下一页