2014-12-02 1 views
0

Я работаю с Spring 3.1.0. Я пытаюсь понять, как весна читает свои xml-файлы. Я пытаюсь понять, как весна занимается неопределенными условиями в определениях бобов.Как конструктор выбирается весной для beans, определенных в xml с родителем?

Например

У меня есть Alarm.java

package com.anshbansal.alarm2; 

public class Alarm { 

    private String type; 
    private int volume; 
    private int hour; 

    public Alarm() { 
    } 

    public Alarm(String type, int volume, int hour) { 
     this.type = type; 
     this.volume = volume; 
     this.hour = hour; 
    } 

    public Alarm(String type, int volume) { 
     this.type = type; 
     this.volume = volume; 
    } 

    public Alarm(int volume, String type) { 
     this.type = type; 
     this.volume = volume; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public void setVolume(int volume) { 
     this.volume = volume; 
    } 

    public void setHour(int hour) { 
     this.hour = hour; 
    } 

    @Override 
    public String toString() { 
     return "Alarm{" + 
       "type='" + type + '\'' + 
       ", volume=" + volume + 
       ", hour=" + hour + 
       '}'; 
    } 
} 

Моя весна XML файл alarm2.xml выглядит следующим образом.

<?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.xsd"> 

     <bean id="propertyRandom" abstract="true"> 
       <constructor-arg value="23" type="int"/> 
     </bean> 


     <bean id="alarm1" class="com.anshbansal.alarm2.Alarm" parent="propertyRandom"> 
       <constructor-arg value="10" type="int"/> 
       <constructor-arg value="Ringing" /> 
     </bean> 


</beans> 

Существует неясность, поскольку это не сразу понятно, какие int войдет в объем и который войдет в час. Если я печатаю, получаю следующее:

Alarm{type='Ringing', volume=23, hour=10} 

Так как весна читает xml-файл, чтобы разрешить, какой конструктор вызвать? Сначала родитель, потом боб? Это где-то задокументировано?

Я знаю, что существуют способы, как указать index и name в качестве атрибутов, но я также должен знать, как справляться с такими неоднозначными условиями. Вот почему я спрашиваю об этом.

ответ

3

С весной documentation,

Конструктор согласование разрешения аргумента происходит с использованием типа в аргументе. Если в аргументах конструктора не существует потенциальной двусмысленности определения компонента, то порядок, в котором аргументы конструктора определены в определении компонента, - это порядок, в котором эти аргументы поставляются соответствующему конструктору, когда bean является инстанцирован.

Я нашел следующий ответ, объясняющий поведение пружины при выборе конструктора.

Если вы задаете конструктор-Arg без индекса, жадного конструктора, который может быть удовлетворен с заданными аргументами будет ссылаться (соответствующий аргументы по типу). В случае с java.io.File, это конструктор File (String parent, String child): аргумент String соответствует по типу, поэтому алгоритм использует этот конструктор.

reference 1 reference 2

При наследовании от родителя, аргументы конструктора сольются (так же, как слияние коллекций собственности). В вашем случае, после слияния аргументов конструктора ребенка боба будет

<constructor-arg value="23" type="int"/> 
<constructor-arg value="10" type="int"/> 
<constructor-arg value="Ringing" /> 

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

+0

Это не объясняет, как конкретный «int» родителя был назначен тому, а не часу. Не могли бы вы объяснить? –

+0

Пересмотрены ответ, чтобы упомянуть о слиянии –

+0

Спасибо за информацию.Как вы находите эту информацию? –

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