Contexts and Dependency Injection (CDI) defines a set of 
complementary services that help improve the structure of application
code.
- A well-defined lifecycle for stateful
{@linkplain javax.enterprise.inject beans} bound to well-defined 
lifecycle {@linkplain javax.enterprise.context contexts}, where 
the set of contexts is {@linkplain javax.enterprise.context.spi 
extensible}
- A sophisticated, typesafe {@linkplain javax.enterprise.inject 
dependency injection mechanism}, including the ability to select 
dependencies at either {@linkplain javax.inject.Qualifier development} 
or {@linkplain javax.enterprise.inject.Alternative deployment} time, 
without verbose configuration
- Support for Java EE modularity and the Java EE component
architecture—the modular structure of a Java EE application is 
taken into account when resolving dependencies between Java EE 
components
- {@linkplain javax.enterprise.inject Integration} with the 
Unified Expression Language, allowing any bean to be used directly 
within a JSF or JSP page
- The ability to {@linkplain javax.decorator decorate} injected 
beans
- The ability to associate 
{@linkplain javax.interceptor interceptors} with beans via typesafe
{@linkplain javax.enterprise.inject interceptor bindings}
- An {@linkplain javax.enterprise.event event} notification model
- A web {@linkplain javax.enterprise.context.ConversationScoped 
conversation context} in addition to the three standard 
web contexts defined by the Java Servlets specification
- An {@linkplain javax.enterprise.inject.spi SPI} allowing portable 
extensions to integrate cleanly with the container
CDI allows objects to be bound to lifecycle contexts, to be 
injected, to be associated with interceptors and decorators, and to 
interact in a loosely coupled fashion by 
{@linkplain javax.enterprise.event.Event firing} and 
{@linkplain javax.enterprise.event.Observes observing} events. 
{@linkplain javax.enterprise.inject Various kinds} of objects are 
injectable, including EJB 3 session beans, managed beans, 
{@linkplain javax.enterprise.inject.Produces producer methods} and 
Java EE resources. We refer to these objects in general terms as beans 
and to instances of beans that are bound to contexts as contextual 
instances.