Skip to main content

Command Palette

Search for a command to run...

Jakarta CDI en Quarkus: Inyección de Dependencias y Más

Updated
3 min read

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

  1. Integración Nativa: CDI está integrado en Quarkus desde el inicio

  2. Compilación AOT: Los beans se procesan en tiempo de compilación

  3. Startup Rápido: La inyección es eficiente gracias a la compilación AOT

  4. 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.

Recursos

More from this blog

JoeDayz

53 posts

Community Guy | Java Champion | AWS Architect | Software Architect