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