Spring推断构造方法
源码
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
// 通过BeanPostProcessor找出了构造方法
// 或者BeanDefinition的autowire属性为AUTOWIRE_CONSTRUCTOR
// 或者BeanDefinition中指定了构造方法参数值
// 或者在getBean()时指定了args
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
// 进行构造方法推断并实例化
//2.第二步
return autowireConstructor(beanName, mbd, ctors, args);
}
情况总结
没有@Autowired注解
默认使用无参构造方法,如果没有无参构造方法直接报错
有@Autowired
如果只有一个required = true,直接注入,注入时没有找到该依赖(参考依赖注入)会报错
多个required = true,直接报错
多个required=false,根据分值算法去决定使用哪一个
主要是计算找到的bean和构造方法参数类型匹配程度有多高。
假设bean的类型为A,A的父类是B,B的父类是C,同时A实现了接口D
如果构造方法的参数类型为A,那么完全匹配,得分为0
如果构造方法的参数类型为B,那么得分为2
如果构造方法的参数类型为C,那么得分为4
如果构造方法的参数类型为D,那么得分为1
前提条件-----能找到这个BD