I'm using annotations-based wiring (ie @Configurable(autowire=Autowire.BY_TYPE)
) for a given class, and I'd like to wi开发者_运维技巧re 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?
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)
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.
精彩评论