저는 최근에 봄 3.2에서 작업하기 시작했습니다. 종속성이 생성자 주입을 통해 전달되는 경우 생성자 인수 해결을 이해하려고합니다. 아래 예제를 만들었습니다.생성자 인수 해결
package com.springinaction.springidol;
public interface Performer {
void perform();
}
package com.springinaction.springidol;
public class Juggler implements Performer {
private int beanBags=3;
private String name;
public Juggler(){
}
public Juggler(String name,int beanBags){
System.out.println("First constructor gets called");
this.beanBags=beanBags;
this.name=name;
}
public Juggler(int beanBags,String name){
System.out.println("Second constructor gets called");
this.beanBags=beanBags;
this.name=name;
}
public void perform(){
System.out.println("JUGGLING "+beanBags+name+" BEANBAGS");
}
}
아래에서 봄 구성 파일의 인스턴스를 찾으십시오. 위의 시나리오에서
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="duke" class="com.springinaction.springidol.Juggler">
<constructor-arg value="Jinesh" />
<constructor-arg value="77" />
</bean>
호출 생성자는 첫 번째 생성자입니다. 그러나 그 후에 XML 파일을 약간 변경하고 두 인수 모두에 type 속성을 추가했습니다. 위의 경우
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="duke" class="com.springinaction.springidol.Juggler">
<constructor-arg type="java.lang.String" value="Jinesh" />
<constructor-arg type="int" value="77" />
</bean>
</beans>
스프링 호출 생성자는 생성자 초이다. 왜 봄이 첫 번째 생성자 대신 두 번째 생성자를 호출하기로 결정했는지 이해할 수 없습니까? 위와 같은 경우에 spring은 type 속성을 전달할 때 호출 할 생성자를 결정하는 방법은 무엇입니까?
이런 상세한 설명을 주셔서 감사합니다 Sotirios. 첫 번째 시나리오에서도 위의 프로세스가 수행됩니까? 동일한 프로세스가 수행되면 첫 번째 시나리오에서 첫 번째 생성자를 호출 한 이유는 무엇입니까? – Beast
@Beast 과정은 동일하지만 여기서는 매개 변수의 순서가 중요합니다. 'ConstructorResolver'는 생성자들의 배열을 따라 가며'(int, String)'을 사용하려하지만'Jinesh' 값을'int'로 변환 할 수 없기 때문에 실패합니다. 'UnsatisfiedDependencyException'이 발생하고 생성자를 건너 뜁니다. 배열의 두 번째 생성자가 후보가되고 (예제에서는 첫 번째)'' "77"'이 'int'로 변환 될 수 있기 때문에 선택됩니다. 스택 아래 어딘가에 변환 시스템이 있습니다. –
replyour help와 모든 도움을 주셔서 감사합니다. 마지막 질문은 maven을 통해 스프링 소스 코드를 통해 디버그하고 싶다면 사용할 수있는 구성 문서가 있습니까? – Beast