Jednym z najsilniejszych akcentów struktury Spring jest koncepcja Dependency Injection. Rozumiem, że jedną z porad jest oddzielenie ogólnego mechanizmu wysokiego poziomu od szczegółów niskiego poziomu (zgodnie z zapowiedzią Dependency Inversion Principle).Jak zbierać i wstrzykiwać wszystkie fasole danego typu w konfiguracji Spring XML
Z technicznego punktu widzenia sprowadza się to do implementacji fasoli, aby wiedzieć jak mało o wstrzykiwaniu fasoli jako zależności, np.
public class PrintOutBean {
private LogicBean logicBean;
public void action() {
System.out.println(logicBean.humanReadableDetails());
}
//...
}
<bean class="PrintOutBean">
<property name="loginBean" ref="ShoppingCartBean"/>
</bean>
Ale co, gdybym chciał mieć mechanizm wysokiego poziomu działający na wielu zależnych ziarnach fasoli?
public class MenuManagementBean {
private Collection<Option> options;
public void printOut() {
for (Option option:options) {
// do something for option
}
//...
}
}
wiem jedno rozwiązanie byłoby użyć @Autowired
adnotacji w singleton fasoli, czyli ...
@Autowired
private Collection<Option> options;
Ale nie to naruszać zasadę separacji? Dlaczego muszę określać, jakie zależności należy wybrać w tym samym miejscu, w którym je używam (np. MenuManagementBean
w moim przykładzie)? Czy istnieje sposób na wstrzyknięcie kolekcji fasoli w konfiguracji XML w ten sposób (bez adnotacji w klasie MMB
)?
<bean class="MenuManagementBean">
<property name="options">
<xxx:autowire by-type="MyOptionImpl"/>
</property>
</bean>
Nie sądzę dodanie @Autowired pola stworzy kolekcję opcji dla Ciebie - to musisz zadeklarować fasoli w twój kontekst zawierający listę opcji. A potem równie dobrze możesz rzucić @Autowired i umieścić w definicji kontekstu MMB. – mdma
@mdma: Jestem pewien, że dodanie '@ Autowired' do właściwości collection pozwala na zebranie wszystkich komponentów typu collection. W ten sposób używamy go cały czas. Dokumentacja wiosna 2.5: http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-autowired-annotation –
Dobra, dobra funkcja! Sprawdziłem dokumenty, ale nie widziałem tego, kiedy patrzyłem. Przepraszam za zamieszanie. – mdma