# 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`:

```go
@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:

```go
@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:

```go
@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:

```go
@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:

```go
@Produces
@ApplicationScoped
public Logger produceLogger(InjectionPoint injectionPoint) {
    return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}
```

### **7\. Stereotypes**

Los stereotypes agrupan múltiples anotaciones:

```go
@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**

* [Demo completo](file:///Users/josediaz/Projects/JoeDayz/jakartaee-2026/quarkus-demos/cdi/)
    
* [Documentación de Quarkus CDI](https://quarkus.io/guides/cdi-reference)
    
* [Jakarta CDI Specification](https://jakarta.ee/specifications/cdi/)
