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>
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
<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>
Comments
Post a Comment