Fine Tunning Annotation Based Autowiring With Primary Or Fallback
Ajustar con precisión la autoconexión basada en anotaciones mediante @Primary o @Fallback
Como la autoconexión por tipo puede dar lugar a varios candidatos, a menudo es necesario tener más control sobre el proceso de selección. Una forma de conseguirlo es mediante la anotación @Primary de Spring.
@Primary indica que se debe dar preferencia a un bean concreto cuando varios beans son candidatos para autoconectarse a una dependencia de valor único. Si existe exactamente un bean principal entre los candidatos, se convierte en el valor autoconectado.
Considera la siguiente configuración, que define firstMovieCatalog como el MovieCatalog principal:
@Configuration
public class MovieConfiguration {
@Bean
@Primary
public MovieCatalog firstMovieCatalog() { ... }
@Bean
public MovieCatalog secondMovieCatalog() { ... }
// ...
}
Como alternativa, desde la versión 6.2 existe la anotación @Fallback, que permite marcar como alternativas los beans que no son los candidatos habituales que se deben inyectar. Si solo queda un bean habitual, también actúa de forma efectiva como principal:
@Configuration
public class MovieConfiguration {
@Bean
public MovieCatalog firstMovieCatalog() { ... }
@Bean
@Fallback
public MovieCatalog secondMovieCatalog() { ... }
// ...
}
Con cualquiera de las dos variantes de configuración anteriores, el siguiente MovieRecommender se autoconecta con firstMovieCatalog:
public class MovieRecommender {
@Autowired
private MovieCatalog movieCatalog;
// ...
}
A continuación se muestran las definiciones de beans equivalentes en XML:
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean class="example.SimpleMovieCatalog" primary="true">
<!-- Inyecta las dependencias que requiera este bean. -->
</bean>
<bean class="example.SimpleMovieCatalog">
<!-- Inyecta las dependencias que requiera este bean. -->
</bean>
<bean id="movieRecommender" class="example.MovieRecommender"/>
</beans>