2016-03-19 13 views
5

Was

Angenommen, ich habe eine Feder Bohne Definition einer Arraylist funktioniert:Wie kann ich eine Instanz von List im Frühjahr injizieren?

<bean id="availableLanguages" class="java.util.ArrayList"> 
    <constructor-arg> 
     <bean class="java.util.Arrays" factory-method="asList"> 
      <constructor-arg> 
       <list> 
        <value>de</value> 
        <value>en</value> 
       </list> 
      </constructor-arg> 
     </bean> 
    </constructor-arg> 
</bean> 

Jetzt kann ich dies in alle Arten von Bohnen injiziert, z.B. wie folgt:

@Controller 
class Controller { 
    @Autowired 
    public Controller(ArrayList<String> availableLanguages) { 
     // ... 
    } 
} 

Das funktioniert super.

Wie es bricht

Allerdings, wenn ich meinen Controller ein klein wenig verändern und die Art List statt ArrayList wie folgt verwenden:

@Controller 
class Controller { 
    @Autowired 
    public Controller(List<String> availableLanguages) { 
     // ... 
    } 
} 

Dann stattdessen bekomme ich eine Liste aller Bohnen vom Typ String eher dann die Bohne, die ich definiert habe. Allerdings möchte ich eigentlich meine Liste in eine nicht änderbare Liste einbinden, aber das wird nur möglich sein, wenn ich meine Abhängigkeit auf eine Liste heruntersetze.

Bisher entdeckt Abhilfe

Die folgende XML-Datei:

<bean id="availableLanguages" class="java.util.Collections" factory-method="unmodifiableList"> 
    <constructor-arg> 
     <bean class="java.util.Arrays" factory-method="asList"> 
      <constructor-arg> 
       <list> 
        <value>de</value> 
        <value>en</value> 
       </list> 
      </constructor-arg> 
     </bean> 
    </constructor-arg> 
</bean> 

arbeitet zusammen mit diesem Controller:

@Controller 
class Controller { 
    @Autowired 
    public Controller(Object availableLanguages) { 
     List<String> theList = (List<String>)availableLanguages; 
    } 
} 

Während dies die zusätzliche Typumwandlung ist hässlich funktioniert.

Entdeckungen bisher

dachte ich, dass es eine special handling for collections in Spring 4.2.5 (the currently most recent version) ist, die alle Schwierigkeiten zu verursachen scheint. Es erzeugt ein spezielles Verhalten, wenn ein Parameter eine Schnittstelle ist, die Collection erweitert. Daher kann ich umgehen, indem ich Object oder eine konkrete Implementierung als Parametertyp verwende.

Frage

Gibt es eine Möglichkeit, eine Liste in eine Bohne direkt zu injizieren? Wie?

+0

Sie können den Namensraum 'util' verwenden. Schauen Sie sich [http://stackoverflow.com/questions/2416056/how-to-define-a-list-bean-in-spring] asnwer an. – josivan

+0

@josivan: Soweit ich das sehen kann, würde dies die Art ändern, wie ich die Liste definiere. Die Definition der Liste ist jedoch nicht das Problem. Es ist die Injektion, die das Problem verursacht, oder fehlt mir irgendetwas darüber, was "util" tut? – yankee

+0

'util: list' ist ein regulärer Bean im Spring-Kontext, den Sie normal injizieren können. Ich bemerke, dass Sie eine Mischung aus Annotation und XML haben, und legen Sie dann im Konstruktor "@ Qualifier" ein. Zum Beispiel '@Qualifier (" myList ")' – josivan

Antwort

0

Mit @Qualifier wird die Bean mit dem angegebenen Qualifikationsmerkmal injiziert. Sie können die Liste benennen, die Sie eine Bohne sein möchten, und das wird gut funktionieren.

Verwandte Themen