2020-02-14

Spring - Fine-tuning annotation-based autowiring with @Primary

Because autowiring by type may lead to multiple candidates, it is often necessary to have more control over the selection process. One way to accomplish this is with Spring’s @Primary annotation. @Primary indicates that a particular bean should be given preference when multiple beans are candidates to be autowired to a single-valued dependency. If exactly one 'primary' bean exists among the candidates, it will be the autowired value.

Let’s assume we have the following configuration that defines firstMovieCatalog as the primary MovieCatalog.

@Configuration 
public class MovieConfiguration { 

 @Bean 
 @Primary 
 public MovieCatalog firstMovieCatalog() 
{ ... } 

 @Bean public MovieCatalog secondMovieCatalog() 
{ ... } 
 // ... 
}

With such configuration, the following MovieRecommender will be autowired with the firstMovieCatalog.

public class MovieRecommender {

 @Autowired private MovieCatalog movieCatalog;
 // ...

}

The corresponding bean definitions appear as follows

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

<context:annotation-config/> 
<bean class="example.SimpleMovieCatalog" primary="true"> 
<!-- inject any dependencies required by this bean --> 
</bean> 
<bean class="example.SimpleMovieCatalog"> 
<!-- inject any dependencies required by this bean --> 
</bean> <bean id="movieRecommender" class="example.MovieRecommender"/> 

</beans>








No comments:

Post a Comment