Я недавно начал работать над весной 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>
В приведенном выше случае конструктор, вызванный пружиной, является вторым конструктором. Я не понимаю, почему весна решила вызывать второй конструктор вместо первого? В таких случаях, как описано выше, как весна решает, какой конструктор вызывается при передаче атрибута типа?
Спасибо за подробное объяснение Sotirios. Выполняется ли вышеуказанный процесс в первом сценарии. Если выполняется тот же процесс, то почему он вызвал первый конструктор в первом сценарии? – Beast
@Beast Процесс тот же, но здесь порядок параметров имеет значение. «ConstructorResolver» просматривает массив конструкторов, пытается использовать '(int, String)', но терпит неудачу, потому что значение 'Jinesh' не может быть преобразовано в' int'. Возникает 'UnsatisfiedDependencyException' и этот конструктор пропускается. Второй конструктор в массиве становится кандидатом (первым в вашем примере) и потому, что '' 77 "' можно преобразовать в 'int', он выбирается. Где-то в стеке, есть система преобразования, делающая вещи. –
Благодарим за вашу помощь и всю вашу помощь. Один последний вопрос, если я хочу отлаживать исходный код весны через maven, есть ли у вас какие-либо файлы конфигурации? – Beast