Неоднозначность аргумента конструктора Spring с простыми типами

Я следую справочной документации Spring 4.0.0.RELEASE. Это говорит

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

Сценарий следующий

package examples;
public class ExampleBean {
    private int years;
    private String ultimateAnswer;
    public ExampleBean(int years, String ultimateAnswer) {
        this.years = years;
        this.ultimateAnswer = ultimateAnswer;
     }
 }

Теперь для разрешения аргументов предлагается использовать атрибут типа в XML.

<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg type="int" value="7500000"/>
<constructor-arg type="java.lang.String" value="42"/>
</bean>

Но когда я игнорирую эту инструкцию, то даже без использования атрибута типа или индекса или имени аргумента в конфигурации XML контейнер Spring легко разрешается аргументы. Пожалуйста, объясните мне, почему необходимо использовать атрибуты типа без необходимости.


person user961690    schedule 30.07.2015    source источник


Ответы (1)


Когда вы игнорируете инструкцию и опускаете атрибуты типа и номера индексов, Spring использует свои собственные правила, чтобы решить, как интерпретировать значения. Если у вас нет нескольких конструкторов, которые Spring может легко запутать, этого может быть достаточно.

Если у вас есть конструкторы с одинаковым количеством аргументов разных типов, то атрибуты типа будут указывать, какой конструктор вы собираетесь вызывать. Однако Spring не использует порядок, в котором аргументы конструктора появляются в XML, чтобы выяснить, какой конструктор использовать, поэтому, если у вас есть несколько конструкторов, таких как

public ExampleBean(int years, String ultimateAnswer) {
        ...
}

public ExampleBean(String stuff, int someNumber) {
    ...
}

то Spring не различает их, если вы настроите его как

<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg type="int" value="1"/>
   <constructor-arg type="java.lang.String" value="foo"/>
</bean>

затем Spring ищет что-то, что принимает строку и целое число в любом порядке, и может принимать любой конструктор в качестве совпадения; это зависит от того, что он находит первым. Номер индекса предотвращает это, он указывает Spring, в каком порядке должны появляться аргументы.

Когда ваши bean-компоненты имеют несколько конструкторов, было бы лучше явно описать аргументы конструктора, чем надеяться, что Spring угадает правильно.

person Nathan Hughes    schedule 30.07.2015