<aside> 👉🏼
</aside>
总结如下:
假设有以下类定义:
public class C { }
public class B extends C { }
public class A extends B implements D { }
public interface D { }
以及以下Spring Bean定义:
@Component
public class MyService {
@Autowired(required = false)
public MyService(A a, D d) {
// 完全匹配A, 接口匹配D,总分=0+1=1
}
@Autowired(required = false)
public MyService(B b, C c) {
// 直接父类匹配B,完全匹配C,总分=2+0=2
}
@Autowired(required = false)
public MyService(A a, B b) {
// 完全匹配A, 直接父类匹配B,总分=0+2=2
}
@Autowired(required = false)
public MyService(C c, D d) {
// 间接父类匹配C,接口匹配D,总分=4+1=5
}
@Autowired(required = false)
public MyService(D d, A a) {
// 接口匹配D, 完全匹配A,总分=1+0=1
}
}
MyService
类,并将其注册为BeanDefinition。MyService
类有多个带@Autowired(required = false)
注解的构造方法。A
的实例、类型为B
的实例、类型为C
的实例和类型为D
的实例。MyService(A a, D d)
:完全匹配A, 接口匹配D,总分=0+1=1MyService(B b, C c)
:直接父类匹配B,完全匹配C,总分=2+0=2MyService(A a, B b)
:完全匹配A, 直接父类匹配B,总分=0+2=2MyService(C c, D d)
:间接父类匹配C,接口匹配D,总分=4+1=5MyService(D d, A a)
:接口匹配D, 完全匹配A,总分=1+0=1MyService(A a, D d)
和MyService(D d, A a)
得分相同,为1。MyService(A a, D d)
和MyService(D d, A a)
分数相同,Spring会选择参数数量最多的构造方法。