Jakarta CDI en Quarkus: Inyección de Dependencias y Más
Introducción
Jakarta CDI (Contexts and Dependency Injection) es una de las especificaciones más importantes de Jakarta EE. En Quarkus, CDI está completamente soportado y es la base para la inyección de dependencias y la gestión del ciclo de vida de los componentes.
¿Qué es CDI?
CDI proporciona un sistema de inyección de dependencias y gestión de contextos que permite crear aplicaciones más modulares y fáciles de probar. En lugar de crear objetos manualmente, CDI los crea e inyecta automáticamente donde se necesitan.
Características Principales
1. Inyección de Dependencias
La forma más básica de usar CDI es con @Inject:
@ApplicationScoped
public class HeroService {
@Inject
EntityManager entityManager;
public Hero createHero(Hero hero) {
entityManager.persist(hero);
return hero;
}
}
2. Scopes (Contextos)
CDI define diferentes scopes que determinan el ciclo de vida de los beans:
@ApplicationScoped: Una instancia por aplicación
@RequestScoped: Una instancia por request HTTP
@SessionScoped: Una instancia por sesión HTTP
@Dependent: Nueva instancia cada vez que se inyecta
3. Qualifiers
Los qualifiers permiten distinguir entre múltiples implementaciones del mismo tipo:
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface HeroQualifier {}
@Service
@HeroQualifier
public class HeroService {
// ...
}
4. Interceptors
Los interceptors permiten ejecutar código antes y después de métodos:
@InterceptorBinding
@Retention(RUNTIME)
@Target({METHOD, TYPE})
public @interface Loggable {}
@Interceptor
@Loggable
public class LoggingInterceptor {
@AroundInvoke
public Object log(InvocationContext context) throws Exception {
// Código antes del método
Object result = context.proceed();
// Código después del método
return result;
}
}
5. Events (Eventos)
CDI permite comunicación desacoplada entre componentes usando eventos:
@Inject
Event<HeroCreatedEvent> heroCreatedEvent;
public Hero createHero(Hero hero) {
entityManager.persist(hero);
heroCreatedEvent.fire(new HeroCreatedEvent(hero));
return hero;
}
public void onHeroCreated(@Observes HeroCreatedEvent event) {
// Manejar el evento
}
6. Producers
Los producers permiten crear beans programáticamente:
@Produces
@ApplicationScoped
public Logger produceLogger(InjectionPoint injectionPoint) {
return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}
7. Stereotypes
Los stereotypes agrupan múltiples anotaciones:
@Stereotype
@ApplicationScoped
@Loggable
@Retention(RUNTIME)
@Target(TYPE)
public @interface Service {}
Ejemplo Completo: Heroes y Villains
En nuestro demo, creamos servicios para gestionar héroes y villanos usando CDI:
HeroService y VillainService: Servicios con qualifiers diferentes
PowerAnalysisService: Servicio que inyecta ambos usando qualifiers
EventObserver: Observa eventos de creación
ConfigurationProducer: Produce Logger y configuración
Ventajas de CDI en Quarkus
Integración Nativa: CDI está integrado en Quarkus desde el inicio
Compilación AOT: Los beans se procesan en tiempo de compilación
Startup Rápido: La inyección es eficiente gracias a la compilación AOT
Testing Fácil: Fácil de mockear dependencias en tests
Conclusión
CDI es fundamental en Quarkus y proporciona una base sólida para crear aplicaciones modulares y mantenibles. Su integración nativa hace que sea fácil de usar y muy eficiente.




