实例化生命周期流程图
2022-08-15 13:48:36 1 举报
Spring 实例化对象声明周期流程图,部分代码段解析
作者其他创作
大纲/内容
autowireConstructor根据构造器自动注入
candidate.getAnnotation(ConstructorProperties.class);判断构造方法上有没有ConstructorProperties 注解,如果有,则获取values,再取其名称
是否有方法覆盖
未解析
将此 bean 的构造函数参数解析为 resolvedValues 对象resolveConstructorArguments,并返回参数的数量
instantiate 方法进行实例化
入口AbstractAutowireCapableBeanFactory#createBeanInstance
进行构造方法参数解析
candidates.length == 1 && explicitArgs == null &&!mbd.hasConstructorArgumentValues()
构造器是否有参数
满足其一
BeanUtils.instantiateClass(constructorToUse);采用 BeanUtils 实例化 Bean
没有参数
是
从 PostProcessors 中获取自动装配的候选构造函数列表determineConstructorsFromBeanPostProcessors
采用 CGLIB 进行实例化instantiateWithMethodInjection
resolveAutowiredArgument解析依赖注入的参数
有参数
1.获取 BeanClass2. 获取 BeanClass 中声明的构造函数
如果上一步没获取到名称,则调用this.beanFactory.getParameterNameDiscoverer();的 getParameterNames(candidate); 获取参数名称
否
获取参数的最小数量
该步骤参考依赖解注入的图解
1. 获取参数数量
resolveBeanClass(); 使用类加载器获取当前 Bean 的 Class
返回解析到的参数
将构造方法列表进行排序
mbd.getPreferredConstructors();获取默认的构造器列表
BeanWrapper bw = new BeanWrapperImpl(beanInstance);根据返回 Bean 实例去实例化 Bean 的包装器
1.获取构造函数的参数类型2.给参数设置默认值,如果是包装类型则设置null,如果是基础类型,则为0,如果在调用方法的时候,传递了构造参数值,则设置构造参数值
遍历构造方法
构造方法参数或者构造方法为空
都不满足
initBeanWrapper(bw);初始化 Bean 包装器
无参数
构造函数不存在
设置构造函数的权限,即使是 private 修饰的构造函数也可以访问
是否传递了构造参数
1.获取默认的第一个构造器
获取实例化策略类,默认是CGLIB实现
创建参数数组createArgumentArray
构造器列表存在
是否需要自动注入走入这里,省略了中间构造器部分的重复代码性能提升
是否存在方法重写
是否进行过解析构造函数或者工厂方法
获取参数名称
1.是否进行过解析构造函数或者工厂方法2.自动注入模式是否为构造器注入3.构造器参数是否存在4.构造器参数是否传入
存在
beanFactory.resolveDependency根据 beanFactory 进行依赖的解析
构造器列表不存在
instantiate 进行实例化创建
调用策略类的实例化方法strategy.instantiate
ctor.newInstance(argsWithDefaultValues);调用反射创建 Bean 实例
1.获取传递进来的构造方法列表2.获取 BeanClass3.根据 BeanClass 获取声明的构造方法
0 条评论
回复 删除
下一页