[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.이것은 Spring이 생성자를 자동 생성하는 방법의 결과이다.
이것은 Spring이 생성자를 자동 생성하는 방법의 결과이다.
첫 번째 작업은 모든 빈 클래스의 생성자를 가져 와서 정렬합니다. 먼저 인수의 양을 줄인 공개 생성자를 배치 한 다음 인수가 줄어든 모든 비공개 생성자를 다시 배치합니다. 이들은 후보 생성자입니다.
그런 다음 BeanFactory에서 인수를 생성하려고 시도하면서 이러한 후보를 반복합니다. Bean이 없거나 다른 이유로 인해 할 수 없으면 후보를 건너 뜁니다. 인수를 찾는 데 성공하면 현재 후보 생성자에게 여러 인수 (인수 목록 길이, 인수의 유형과 매개 변수의 근접 정도 등)에 따라 가중치를 부여합니다. 그런 다음 이전 후보자의 체중을 확인한 다음 이전 후보자의 체중을 비교합니다.
이 프로세스가 끝날 때 후보 생성자가 있으면 Spring은이를 사용합니다.
Spring이 3 arg 생성자보다 2 arg 생성자를 사용하고 있다고 말하면, 3 arg 생성자에 유형 중 하나의 bean이 없다는 것을 의미합니다.
-
==============================
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 번째 생성자와 일치하는 모든 인수가 호출됩니다. 결론 : 여러 생성자의 경우, 스프링 컨테이너는 모든 종속 속성을 확인하고 생성자 중 객체를 생성하는 데 사용할 수있는 가능한 모든 속성을 기반으로 검증하려고 시도합니다. 초기화 될 수 있습니다.
from https://stackoverflow.com/questions/21906361/dependency-injection-with-autowire-constructor-when-multiple-constructors-are by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 1로 지정하면 Derby Auto가 100 씩 증가합니다. (0) | 2019.02.20 |
---|---|
[SPRING] 봄 데이터 나머지 2.0.0.RELEASE 나누기 코드 RC1 이전에 작동 (0) | 2019.02.20 |
[SPRING] Spring 4.1 @Qualifier가 작동하지 않습니다. (0) | 2019.02.20 |
[SPRING] Spring 데이터를 느슨하게로드할지 여부 지정하기 (0) | 2019.02.20 |
[SPRING] 원격 PropertySource (0) | 2019.02.20 |