Seleccionar página

En el post anterior se indico que se podrían haber usado “Qualifiers”, ahora voy a explicar como habria quedado lo mismo hecho asi.

Recordemos….

Tenemos un servicio que devuelve el saludo, pero queremos que ademas de vuelve la fecha y la hora.

El interface:

public interface HelloService {
String sayHello(String hello);
}

Ahora vamos ha crear 2 “qualifiers”, 1 para cada servicio:

@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Hello {}


@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface HelloWithDate {}

La implementación del interface devuelve el saludo será:


@Hello
public class HelloServiceImpl implements HelloService {

@Override
public String sayHello(String hello) {
return "Server : " + hello;
}
}

La implementación del interface devuelve el saludo con la fecha será:


@HelloWithDate
public class HelloWithDateServiceImpl implements HelloService {

@Override
public String sayHello(String hello) {
return new Date() + " (Server : " + hello + ")";
}
}

Ahora para injectar uno u otro seria como sigue:

@Inject @Hello
HelloService helloService;


@Inject @HelloWithDate
HelloService helloService;

¿Por que usar esto con el interface comun y no usar directamente la implementación concreta?

Pues hay que entender que un “qualifier” es como una extensión del interface. Y usandolo asi no crea una dependencia directa sobre ninguna implementación en particular.

CDI nos ofrece un qualifier que es el @Named que tambien habriamos podido utilizar, pero nos queraria más dificil si luego se quisiera refectorizar ya que dependeriamos de textos entrecomillados. Quedaria asi:


@Named("hello")
public class HelloServiceImpl implements HelloService {

@Override
public String sayHello(String hello) {
return "Server : " + hello;
}
}


@Named("helloWithDate")
public class HelloWithDateServiceImpl implements HelloService {

@Override
public String sayHello(String hello) {
return new Date() + " (Server : " + hello + ")";
}
}

Y se inyectarian asi:


@Inject @Named("hello")
HelloService helloService;

Y el otro servicio así:


@Inject @Named("helloWithDate")
HelloService helloService;