Co działa
Załóżmy, że mam definicję wiosna fasolowa z ArrayList:Jak mogę wstawić wystąpienie listy na wiosnę?
<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>
Teraz mogę wstrzyknąć to do wszystkich rodzajów ziarna, na przykład tak:
@Controller
class Controller {
@Autowired
public Controller(ArrayList<String> availableLanguages) {
// ...
}
}
Działa to świetnie.
Jak rozkłada
Jednak jeśli zmienię mój kontroler odrobinę i użyć typu List
zamiast ArrayList
takiego:
@Controller
class Controller {
@Autowired
public Controller(List<String> availableLanguages) {
// ...
}
}
Wtedy zamiast uzyskać listę wszystkich ziaren typu String
raczej niż zdefiniowany przeze mnie ziarno. Jednak faktycznie chcę zawinąć moją Listę do niemożliwiowej Listy, ale będzie to możliwe tylko wtedy, gdy zmniejszę swoją zależność do listy.
Dotychczas odkryto obejście
Następujący plik XML:
<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>
współpracuje z tego kontrolera:
@Controller
class Controller {
@Autowired
public Controller(Object availableLanguages) {
List<String> theList = (List<String>)availableLanguages;
}
}
Chociaż to działa dodatkowy typ obsada jest brzydki.
Ustalenia dotychczas
Pomyślałem, że istnieje special handling for collections in Spring 4.2.5 (the currently most recent version) który wydaje się powodować wszystkie problemy. Tworzy szczególne zachowanie, gdy parametr jest interfejsem rozszerzającym Collection
. W ten sposób można obejść, używając Object
lub konkretnej implementacji jako typ parametru.
Pytanie
Czy istnieje sposób bezpośredniego wprowadzenia listy do fasoli? W jaki sposób?
Możesz użyć przestrzeni nazw 'util'. Spójrz na [this] (http://stackoverflow.com/questions/2416056/how-to-define-a-list-bean-in-spring) asnwer. – josivan
@josivan: O ile widzę, zmieniłoby to sposób definiowania listy. Jednak definicja listy nie stanowi problemu. To wstrzyknięcie powoduje problem lub brakuje mi czegoś o tym, co robi "util"? – yankee
'util: list' to zwykły komponent bean w kontekście Spring, możesz go wstrzyknąć normalnie. Zauważyłem, że masz mieszankę adnotacji i XML, a następnie tacę, aby użyć '@ Qualifier' w konstruktorze. Na przykład '@Qualifier (" myList ")' – josivan