Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way in Spring to autowire all dependencies of a given type?

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?

like image 987
Naftuli Kay Avatar asked Aug 16 '11 18:08

Naftuli Kay


People also ask

What does @spring expect @autowire dependencies to do?

Spring expects @Autowired dependencies to be available when the dependent bean is being constructed. If the framework cannot resolve a bean for wiring, it will throw the below-quoted exception and prevent the Spring container from launching successfully: expected at least 1 bean which qualifies as autowire candidate for this dependency.

What is autowire by type in Spring Boot?

This option enables autowire based on bean names. Spring looks up the configuration file for a matching bean name. If found, this bean is injected in the property. However, if no such bean is found, an error is raised. . 3. Autowiring ‘byType’: This option enables the autowire based on bean type.

What is spring bean autowiring?

The Spring framework enables automatic dependency injection. In other words, by declaring all the bean dependencies in a Spring configuration file, Spring container can autowire relationships between collaborating beans. This is called Spring bean autowiring.

What is @AutoWired annotation in spring?

Finally, we’ll look at @Autowired annotation with its different modes. Spring provides a way to automatically detect the relationships between various beans. This can be done by declaring all the bean dependencies in Spring configuration file.


2 Answers

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)

like image 161
Bozho Avatar answered Nov 15 '22 11:11

Bozho


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.

like image 27
skaffman Avatar answered Nov 15 '22 13:11

skaffman