Spring推断构造
2023-02-20 22:14:15 4 举报
Spring推断构造
作者其他创作
大纲/内容
添加进requiredConstructor,然后判断candidates是否不为空,不为空就报错
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
一个required为true多个required为false
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors
mbd.getInstanceSupplier()是否添加了Supplier
mbd.getFactoryMethodName()是否是@Bean创建的
resolveBeanClass()获取beanClass
多个required为false
没加@Autowired注解
异常
没加
找到所有实现了SmartInstantiationAwareBeanPostProcessor的组件,进行遍历执行determineCandidateConstructors方法
是否加了@Autowired注解
多个有参构造方法
执行determineCandidateConstructors方法
否
有一个@Autowired(required=true),发现有另外的加了@Autowired的方法
一个有参构造方法
判断requiredConstructor是否为空,不为空代表已经有一个加了@Autowired(required=true)的构造方法
加了@Autowired注解
没有添加了@Autowired注解的构造方法,并且类中只有一个构造方法,并且是有参的
如果有多个有参,且没有加了@Autowired的构造方法。直接是空值。结束if判断将筛选出来的构造方法加入到candidateConstructorsCache缓存中
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#determineCandidateConstructors
多个required为true
判断当前类是不是java.开头,例如String
都没有,则需要找到默认的构造方法,并向其参数进行依赖注入mbd.getPreferredConstructors()
遍历
如果是原型Bean会来回创建,缓存构造方法
是
判断是否是代理类,如果是代理类就去找到被代理的那个类并找到加了@Autowired的构造方法,然后赋值给MergedAnnotation<?> ann
对rawCandidates(当前类所有构造方法)进行遍历,rawCandidates(存放符合的构造方法),requiredConstructor(存放required为true的构造方法),defaultConstructor(存放无参构造方法)
null
加了
默认的构造方法也没有找到,选择默认的无参构造
candidates与defaultConstructor都不为空,将defaultConstructor加入到candidates
如果当前构造方法是无参的就加入进defaultConstructor
返回这个方法
查看candidateConstructorsCache是否有缓存的构造方法,没有就进行对bean的构造方法进行遍历
如果返回是null,那么会执行无参构造方法,如果没有无参构造方法,那么会直接报错
遍历这个类与父类,找到是有有加了LookUp的注解,找到就加入到“lookupMethodsChecked”缓存中
只有一个无参构造方法
findAutowiredAnnotation(candidate)判断是否加了@Autowired
有多个@Autowired(required=true)
一个required为true
0 条评论
回复 删除
下一页