En el post anterior se indico que se podrían haber usado “Qualifiers”, ahora voy a explicar como habría quedado lo mismo, pero con el uso de los «Qualifier».
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;
0 comentarios