<aside> 👉🏼

</aside>

Link


Title

总结如下:

  1. 参数最多的构造方法优先
  2. 权重分最低的构造方法优先
  3. 综合考虑参数数量和权重分

示例

假设有以下类定义:

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
    }
}

运行流程

  1. 扫描组件
  2. 解析构造方法
  3. 查找依赖项
  4. 计算匹配分数
  5. 综合评分
  6. 选择最佳构造方法