2012-08-02 24 views
16

Digamos que necesito confiar en varias implementaciones de un Spring Bean. Tengo una interfaz AccountService y dos implementaciones: DefaultAccountServiceImpl y SpecializedAccountServiceImpl.Manejo de varias implementaciones de un Spring Bean/interfaz

  1. ¿Cómo es posible (inyectar una u otra implementación) en Spring?

  2. ¿Qué implementación usará la siguiente inyección?

    @Autowired 
    private AccountService accountService; 
    

Respuesta

17

anuncio. 1: puede usar @Qualifier annotation o autocablear usando @Resource en contraposición a @Autowired, que por defecto tiene el nombre del campo en lugar de escribir.

Ad. 2: Fallará en el tiempo de ejecución diciendo que dos beans están implementando esta interfaz. Si uno de sus granos es adicionalmente annotated with @Primary, se preferirá cuando realice el autoenvío por tipo.

+0

Tomasz: Yo entiendo que tengo que usar '@Qualifier ("especializado")' para especificar la aplicación que se va a inyectar. Entonces, si defino mi servicio usando java (en lugar de xml), ¿cómo especifico qué calificador tiene? ¿Esto hará: '@Service (" especializado ")'? – balteo

+2

@balteo: sí. Asigne el nombre del servicio manualmente en la anotación '@ Service' o tome el nombre de clase simple con el primer carácter con mayúsculas y minúsculas:' @Qualifier ("specializedAccountServiceImpl") '. –

13
@Autowired 
@Qualifier("impl1") 
BaseInterface impl1; 

@Autowired 
@Qualifier("impl2") 
BaseInterface impl2; 

@Component(value="impl1") 
public class Implementation1 implements BaseInterface { 

} 

@Component(value = "impl2") 
public class Implementation2 implements BaseInterface { 

} 


For full code: https://github.com/rsingla/springautowire/ 
+1

¿Qué sucede si quiero cambiar la implementación de todos los lugares donde yo @Autowire la interfaz? No quiero especificar explícitamente en todos los lugares de uso. –

+1

Puede usar la expresión Spring usando @value y poner el valor en el archivo de propiedad (application.properties) y cambiar entre los Qualifiers. (No he intentado esto en este caso particular, pero estoy seguro de que es solo una cadena que está tomando la anotación, por lo que debería funcionar bien. –

+0

Bien, gracias por la valiosa solución :) –

Cuestiones relacionadas