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?
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
@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
'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