복붙노트

[SPRING] 여러 생성자가 존재할 때 autowire = "constructor"로 종속성 삽입?

SPRING

여러 생성자가 존재할 때 autowire = "constructor"로 종속성 삽입?

아래 생성자가있는 텍스트 편집기 클래스가 있습니다.

 public class TextEditor {
       private SpellChecker spellChecker;

       private SpellChecker1 spellChecker1;

       private SpellChecker2 spellChecker2;

     public TextEditor(SpellChecker spellChecker) {
          this.spellChecker = spellChecker;
        }

       public TextEditor(SpellChecker2 spellChecker2) {
              this.spellChecker2 = spellChecker2;
           }

       public TextEditor(SpellChecker spellChecker, SpellChecker1 spellChecker1,SpellChecker2 spellChecker2) {
              this.spellChecker = spellChecker;
              this.spellChecker1 = spellChecker1;
              this.spellChecker2 = spellChecker2;
           }

       public TextEditor(SpellChecker spellChecker, SpellChecker1 spellChecker1) {
              this.spellChecker = spellChecker;
              this.spellChecker1 = spellChecker1;
           }
        }

봄 콩에서 나는 가지고있다.

<bean id="textEditor" class="com.TextEditor" autowire="constructor">
</bean>

두 개의 인수가있는 생성자가 일관되게 호출되는 것을 관찰합니다. 그것은 무작위인가? 하지 말아야 할 것  봄 예외 예외 becoz 그것은 어떤 생성자를 호출해야하는지 몰라?

해결법

  1. ==============================

    1.이것은 Spring이 생성자를 자동 생성하는 방법의 결과이다.

    이것은 Spring이 생성자를 자동 생성하는 방법의 결과이다.

    첫 번째 작업은 모든 빈 클래스의 생성자를 가져 와서 정렬합니다. 먼저 인수의 양을 줄인 공개 생성자를 배치 한 다음 인수가 줄어든 모든 비공개 생성자를 다시 배치합니다. 이들은 후보 생성자입니다.

    그런 다음 BeanFactory에서 인수를 생성하려고 시도하면서 이러한 후보를 반복합니다. Bean이 없거나 다른 이유로 인해 할 수 없으면 후보를 건너 뜁니다. 인수를 찾는 데 성공하면 현재 후보 생성자에게 여러 인수 (인수 목록 길이, 인수의 유형과 매개 변수의 근접 정도 등)에 따라 가중치를 부여합니다. 그런 다음 이전 후보자의 체중을 확인한 다음 이전 후보자의 체중을 비교합니다.

    이 프로세스가 끝날 때 후보 생성자가 있으면 Spring은이를 사용합니다.

    Spring이 3 arg 생성자보다 2 arg 생성자를 사용하고 있다고 말하면, 3 arg 생성자에 유형 중 하나의 bean이 없다는 것을 의미합니다.

  2. ==============================

    2.좀 더 정확하게 예를 들어 이해하는 데 도움이 될 수 있습니다. 따라서 Employee 클래스가 하나 있고 자격 및 주소와 관계가 있으며 bean은 xml 선언 내에서 사용할 수 있습니다.

    좀 더 정확하게 예를 들어 이해하는 데 도움이 될 수 있습니다. 따라서 Employee 클래스가 하나 있고 자격 및 주소와 관계가 있으며 bean은 xml 선언 내에서 사용할 수 있습니다.

    <bean id="qualification" class="com.Autowiring.constructor.Qualification">
        <property name="highestQualification" value="BTech"/>
        <property name="certifcations" value="SCJP"/>
    </bean>
    
    <bean name="address" class="com.Autowiring.constructor.Address">
        <property name="city" value="Bangalore" />
        <property name="zip" value="560054" />
        <property name="building" value="Building One" />
    </bean>
    

    우리는 네 번째 생성자를 가지고 있습니다. 즉, 주소와 자격을 두 번 취하고 두 번째는 자격을 얻고 세 번째 생성자는 주소를 취한 다음 네 번째는 ID, 이름, dob, 주소 및 자격으로 시작하는 모든 필드를 취합니다.

    // 생성자 - 1

    public Employee(Address address, Qualification qualification) {
        super();
        System.out.println(1);
        this.address = address;
        this.qualification = qualification;
    }
    

    // 생성자 - 2

    public Employee(Qualification qualification) {
        super();
        System.out.println(2);
        this.qualification = qualification;
    }
    

    // 생성자 - 3

    public Employee(Address address) {
        super();
        System.out.println(3);
        this.address = address;
    }
    

    // 생성자 - 4

    public Employee(int id, String name, Date dob, Address address,
            Qualification qualification) {
    
        super();
        System.out.println(4);
        this.id = id;
        this.name = name;
        this.dob = dob;
        this.address = address;
        this.qualification = qualification;
    }
    

    Case-1 : Constructor 1과 4가 선언되지 않았고 employee bean 선언에 constructor-arg가 없다고 가정 해 봅시다.

    Behavior : 생성자의 정의 순서를 변경하면 생성자 3의 위치가 3으로 바뀌면 마지막 생성자가 선언 된대로 생성자 3이 호출됩니다.

    Case-2 : Constructor 4가 선언되지 않았고 Employee Bean 선언에 constructor-arg가 없다고 가정 해 봅시다.

    동작 : 생성자 1에 대한 일치하는 인수의 조건을 만족하도록 bean 선언에서 사용할 수있는 유형 및 주소를 얻을 수 있으므로이 경우 생성자 1이 호출됩니다.

    사례 -3 : employee bean 선언에 constructor-arg가 없다고 가정 해 봅시다.

    Behavior :이 경우 생성자 1이 호출 될 것입니다. 왜냐하면 빈 선언문에서 사용할 수있는 타입 Qualification과 Address를 얻을 수 있기 때문에 생성자 1과 일치하는 인수의 조건을 만족하지만 4 번째 생성자를 호출 할 수 없습니다 bean 선언 파일에서 id, name 및 dob를 사용할 수 없으므로 1 차 생성자가 Bean 선언에서 사용할 수있는 Qualification 및 Address를 갖기 때문에 가장 일치하는 생성자입니다.

    사례 -4 : 직원 bean 선언에 constructor-arg가 있다고 가정하고 모든 생성자를 사용할 수 있습니다.

    행동 : bean 선언 파일에서 id, name, dob, qualification 및 address를 사용할 수 있으므로 4 번째 생성자를 호출 할 수 있습니다. 따라서 3 번째 인수는 생성자 arg에서 가져오고 마지막 2 개는 빈 자체의 선언에서 가져옵니다. 따라서 4 번째 생성자에서부터 4 번째 생성자와 일치하는 모든 인수가 호출됩니다. 결론 : 여러 생성자의 경우, 스프링 컨테이너는 모든 종속 속성을 확인하고 생성자 중 객체를 생성하는 데 사용할 수있는 가능한 모든 속성을 기반으로 검증하려고 시도합니다. 초기화 될 수 있습니다.

  3. from https://stackoverflow.com/questions/21906361/dependency-injection-with-autowire-constructor-when-multiple-constructors-are by cc-by-sa and MIT license