9

I'm using annotations-based wiring (ie @Configurable(autowire=Autowire.BY_TYPE)) for a given class, and I'd like to wire all beans of a given type into it as a list:

application context:

<beans>
    <bean class="com.my.class.FirstConfigurer"/>
    <bean class="com.my.class.SecondConfigurer"/>
</beans>

class to autowire into:

@Configurable(autowire=Autowire.BY_TYPE) public class Target {
    ...
    public void setConfigurers(List<Configurer> configurers) { ... }
}

All dependencies implement a common interface called Configurer

Is there a way to make this work to have all dependencies of a type wired together in a collection and injected where necessary, or should I define a <list> in XML or something?

skaffman
  • 398,947
  • 96
  • 818
  • 769
Naftuli Kay
  • 87,710
  • 93
  • 269
  • 411

2 Answers2

9

Yes,

@Inject
private List<Configurer> configurers;

works, and you get a list of all beans implementing the interface. (multiple variations - @Inject or @Autowired, field, setter or constructor injection - all work)

Bozho
  • 588,226
  • 146
  • 1,060
  • 1,140
2

This should work:

@Configurable(autowire=Autowire.BY_TYPE) 
public class Target {

    @Autowired
    public void setConfigurers(List<Configurer> configurers) { ... }

}

This is described in section 3.9.2 of the Spring manual:

It is also possible to provide all beans of a particular type from the ApplicationContext by adding the annotation to a field or method that expects an array of that type [...] The same applies for typed collections.

skaffman
  • 398,947
  • 96
  • 818
  • 769
  • Unfortunately, this isn't working for me. I'm running Spring 3.0.1, I have configurable defined on my target class, autowired defined on my setter, load-time-weaving configured properly, configurer instances loaded in my application context, but no autowiring happens for this property, though other properties are autowired properly. Weird. I can see that Spring is creating the configurer in my app-context, but when autowiring comes, it doesn't include it. Do I need more than one for it to work? – Naftuli Kay Aug 19 '11 at 01:07