2016-03-19 20 views
5

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?

+0

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

+0

@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

+0

'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

Odpowiedz

0

Użycie @Qualifier spowoduje wstrzyknięcie fasoli z danym kwalifikatorem. Możesz nazwać listę, która ma być fasolą i która będzie działać dobrze.

Powiązane problemy