Seleccionar página

Java EE 6 y el uso de los “Qualifier”

por | Jun 28, 2011 | Java, JBoss AS / JBoss EAP / WildFly, Seam

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;

Te puede interesar…

0 comentarios

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *