One of the strongest accents of the Spring framework is the Dependency Injection concept. I understand one of the advices behind that is to separate general high-level mechanism from low-level details (as announced by Dependency Inversion Principle).
Technically, that boils down to having a bean implementation to know as little as possible about a bean being injected as a dependency, e.g.
public class PrintOutBean {     private LogicBean logicBean;     public void action() {         System.out.println(logicBean.humanReadableDetails());     }     //... }  <bean class="PrintOutBean">     <property name="loginBean" ref="ShoppingCartBean"/> </bean> But what if I wanted to a have a high-level mechanism operating on multiple dependent beans?
  public class MenuManagementBean {        private Collection<Option> options;        public void printOut() {             for (Option option:options) {               // do something for option             }             //...        }   } I know one solution would be to use @Autowired annotation in the singleton bean, that is...
  @Autowired   private Collection<Option> options; But doesn't it violate the separation principle? Why do I have to specify what dependents to take in the very same place I use them (i.e. MenuManagementBean class in my example)?  Is there a way to inject collections of beans in the XML configuration like this (without any annotation in the MMB class)?
<bean class="MenuManagementBean">     <property name="options">        <xxx:autowire by-type="MyOptionImpl"/>     </property>  </bean> In Spring Boot, we can use Spring Framework to define our beans and their dependency injection. The @ComponentScan annotation is used to find beans and the corresponding injected with @Autowired annotation. If you followed the Spring Boot typical layout, no need to specify any arguments for @ComponentScan annotation.
Old question and in Spring 3.1 it is possible:
public class PluginPrototypeTest extends ASpringWebTest {   @Autowired   Collection<IDummyRepo> repos;    @Test   public void cacheTest() {     assertNotNull(repos);     assertEquals(2, repos.size());     for(IDummyRepo r: repos){       System.out.println(r.getName());     }   } }  @Repository public class DummyRepo implements IDummyRepo {   @Override   public String getName(){     return "DummyRepo";   } } @Repository public class DummyRepo2 implements IDummyRepo {   @Override   public String getName(){     return "DummyRepo2";   } } If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With