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>