Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to collect and inject all beans of a given type in Spring XML configuration

Tags:

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> 
like image 670
Grzegorz Oledzki Avatar asked May 09 '10 21:05

Grzegorz Oledzki


People also ask

How do you inject specific beans in a Spring boot?

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.


1 Answers

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";   } } 
like image 171
takacsot Avatar answered Dec 13 '22 17:12

takacsot