Конструктор неясности типа инжекции в Spring

Конструктор инжекционного типа двусмысленности в Spring

В среде Spring, когда ваш класс содержит несколько конструкторов с одинаковым количеством аргументов, это всегда будет вызывать проблемуconstructor injection argument type ambiguities.

проблема

Давайте посмотрим на этот пример bean-компонента. Он содержит два метода конструктора, оба принимают 3 аргумента с разными типами данных.

package com.example.common;

public class Customer
{
    private String name;
    private String address;
    private int age;

    public Customer(String name, String address, int age) {
        this.name = name;
        this.address = address;
        this.age = age;
    }

    public Customer(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }
    //getter and setter methods
    public String toString(){
        return " name : " +name + "\n address : "
               + address + "\n age : " + age;
    }

}

В файле конфигурации bean-компонента Spring передайте «example» для имени, «188» для адреса и «28» для возраста.




    

        
            example
        

        
            188
        

        
            28
        
        

Запустите его, каков ваш ожидаемый результат?

package com.example.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App
{
    public static void main( String[] args )
    {
        ApplicationContext context =
          new ClassPathXmlApplicationContext(new String[] {"Spring-Customer.xml"});

        Customer cust = (Customer)context.getBean("CustomerBean");
        System.out.println(cust);
    }
}

Выход

 name : example
 address : 28
 age : 188

Результат не тот, который мы ожидали, запускается второй конструктор вместо первого конструктора. В Spring тип аргумента «188» способен конвертировать в int, поэтому Spring просто конвертирует его и берет второй конструктор, даже если вы предполагаете, что это должна быть строка.

Кроме того, если Spring не может решить, какой конструктор использовать, он выдаст следующее сообщение об ошибке.

constructor arguments specified but no matching constructor
found in bean 'CustomerBean' (hint: specify index and/or
type arguments for simple parameters to avoid type ambiguities)

Решение

Чтобы это исправить, вы всегда должны указывать точный тип данных для конструктора через атрибут type, например так:



    

        
            example
        

        
            188
        

        
            28
        

    

Запустите его снова, теперь вы получите то, что ожидали.

Выход
 name : example
 address : 188
 age : 28

Note
Всегда рекомендуется явно объявлять тип данных для каждого аргумента конструктора, чтобы избежать проблемы неоднозначности типа внедрения конструктора, описанной выше.