CDI significa "inyección de contexto y dependencia", mientras que Spring es un ecosistema completo alrededor de un contenedor de inyección de dependencia. Para comparar ambos, debe diferenciar la comparación.
Dependency injection es manejado por ambos contenedores. La diferencia principal es el hecho de que CDI maneja DI en una forma dinámica (también conocida como: con estado), esto significa que las dependencias se resuelven en tiempo de ejecución. El enfoque de Spring es estático - esto significa que los componentes están conectados entre sí al tiempo de creación. Si bien la forma CDI puede parecer un poco inusual en un primer vistazo, es muy superior y ofrece opciones mucho más avanzadas (estoy escribiendo esto con el fondo de dos aplicaciones productivas CDI).
Si nos fijamos en el ecosistema , la situación es diferente: El resorte viene con una gran cantidad de frascos (> 150), mientras que el CDI es bastante pequeña por sí misma. Un uso típico de CDI sería dentro de un servidor de aplicaciones Java EE 6, pero puede hacer que funcione fácilmente en un motor de servlets o incluso en Java SE. Esto significa que el uso de CDI no supone el uso de Hibernate, JPA, EJB o lo que sea, eso depende de usted.
Si necesita más funcionalidad, CDI viene con el concepto de extensiones portátiles (que en sí mismo hace que la API valga la pena). Existen módulos de extensión independientes como Apache CODI y Seam 3 y cubren temas como seguridad, correo, informes y más.
En resumen: CDI no es nada como un "reemplazo" para el ecosistema de Spring, es más bien una mejora sobre el mecanismo de inyección de dependencia de Spring. Es parte de Java EE 6, por lo que si está en un GlasFish con Java EE 6, definitivamente debe ir a CDI. En mi opinión, tu pregunta es más bien: ¿Puedo reemplazar Spring con Java EE 6? Creo que mi respuesta es bastante obvia ;-)
Tenga una mirada en Weld a tener un buen comienzo ...
Véase también https://dzone.com/articles/cdi-10-vs-spring-31-feature – GKislin