2015-07-30 3 views
2

Я следую за Spring Reference Documentation 4.0.0.RELEASE. Это говоритСложный конструктор Аргумент неопределенности с простыми типами

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

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

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, весна контейнер легко решает аргументы. Пожалуйста, объясните мне, почему необходимо использовать атрибуты типа без необходимости.

ответ

2

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

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

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

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

то весна не различает между ними, если настроить его как

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

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

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

+0

Спасибо за ответ Sir ... – user961690

Смежные вопросы