Одним из самых сильных акцентов в структуре Spring является концепция Dependency Injection. Я понимаю, что один из советов заключается в том, чтобы отделить общий механизм высокого уровня от низкоуровневых деталей (как объявлено Принцип инверсии зависимостей).
Технически это сводится к тому, что реализация bean должна знать как можно меньше о bean, который вводится как зависимость, например.
public class PrintOutBean {
private LogicBean logicBean;
public void action() {
System.out.println(logicBean.humanReadableDetails());
}
//...
}
<bean class="PrintOutBean">
<property name="loginBean" ref="ShoppingCartBean"/>
</bean>
Но что, если бы я хотел иметь механизм высокого уровня, работающий на нескольких зависимых beans?
public class MenuManagementBean {
private Collection<Option> options;
public void printOut() {
for (Option option:options) {
// do something for option
}
//...
}
}
Я знаю, что одним решением было бы использовать аннотацию @Autowired
в singleton bean, то есть...
@Autowired
private Collection<Option> options;
Но разве это не нарушает принцип разделения? Почему я должен указать, какие иждивенцы взять в том же месте, где я их использую (т.е. MenuManagementBean
класс в моем примере)?
Есть ли способ встраивать коллекции beans в такую конфигурацию XML (без какой-либо аннотации в классе MMB
)?
<bean class="MenuManagementBean">
<property name="options">
<xxx:autowire by-type="MyOptionImpl"/>
</property>
</bean>