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;

0 comentarios

Enviar un comentario

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

Blog de Neodoo Microsystems
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles. Puedes encontrar más información en nuestra Política de privacidad y Política de cookies.