14 de marzo de 2020

Desambiguar entre dos beans

Por ahora sólo hemos tenido cargado un bean que cumpla con la clase que pedimos de tipo Test bien porque sólo cargábamos un bean de ese tipo o porque lo sobrescribíamos.

La solicitud de un bean en general no se va a hacer explícitamente solicitándolo con getBean(). Lo normal es que en nuestro código haya partes que necesitan de un objeto que nos proporcione una funcionalidad determinada y que lo ofrezca una clase concreta o una implementación de una interface. Casos típicos son objetos DAO, serializadores o servicios por ejemplo.

En estos casos nuestro código tendrá definida una dependencia y Spring se encargará de satisfacerla con sus beans si le hemos dado las herramientas suficientes (hemos definido los beans que cubren esa necesidad en nuestro contenedor). Cómo definir está dependencia lo veremos más adelante cuando veamos las distintas formas de inyectar dependencias.

Ahora mismo lo que debe quedarnos claro es que al definir una dependencia puede ocurrir que haya varios beans que la cubran y entonces Spring no sabrá cuál tiene que usar si no le ayudamos. La forma de hacerlo será poniendo un nombre que distinga a nuestro beans. Todos los beans van a tener un nombre generado si no se lo ponemos pero es mejor ponérselo si puede haber conflicto (normalmente no lo habrá: seguramente no tendremos dos DAO/Repository para un mismo tipo o el mismo servicio implementado y cargado dos veces).

Hemos visto dos formas de definir nuestros bean y en cada una se hace de una forma:
  1. Se puede poner el nombre como atributo XML en la definición de nuestra etiqueta bean por XML
    <bean class="es.lanyu.Test" id="test" ...>
    
  2. Si usamos la anotación @Component se puede añadir su nombre como valor entre paréntesis a continuación de esta anotación
    @Component("anotacion")
    public class Test extends es.lanyu.Test {...}
    
Ahora para probar el código forzamos la carga de dos beans distintos que cumplan con el tipo Test. Si siguiéramos usando la invocación con sólo el tipo nos saldría la excepción:

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'es.lanyu.Test' available: expected single matching bean but found 2: anotacion,test

Pero vamos a usar la sobrecarga del método getBean(String, Class) que incluye el nombre además del tipo de bean que usamos. De esta forma podemos recuperar uno u otro bean usando el nombre para desambiguarlos ("test" o "anotacion").
test = context.getBean("test", Test.class);
test = context.getBean("anotacion", Test.class);
Puedes encontrar el código hasta aquí en su repositorio de GitHub y ver el video del webinar.


En la siguiente entrada vamos a ver la tercera forma de crear un bean: Configuración por Java.

No hay comentarios:

Publicar un comentario

Compárteme

Entradas populares