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

Posted by GrzegorzOledzki on Stack Overflow See other posts from Stack Overflow or by GrzegorzOledzki
Published on 2010-05-09T21:45:48Z Indexed on 2010/05/09 21:48 UTC
Read the original article Hit count: 230

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>

© Stack Overflow or respective owner

Related posts about java

Related posts about spring