type=page
status=published
title=Dependency Injection
next=injection003.html
prev=injection001.html
~~~~~~
Dependency Injection
====================

[[BABDJGIE]]

[[dependency-injection]]
Dependency Injection
--------------------

Dependency injection enables you to turn regular Java classes into
managed objects and to inject them into any other managed object. Using
dependency injection, your code can declare dependencies on any managed
object. The container automatically provides instances of these
dependencies at the injection points at runtime, and it also manages the
lifecycle of these instances for you.

Dependency injection in Java EE defines scopes, which determine the
lifecycle of the objects that the container instantiates and injects.
For example, a managed object that is only needed to respond to a single
client request (such as a currency converter) has a different scope than
a managed object that is needed to process multiple client requests
within a session (such as a shopping cart).

You can define managed objects (also called managed beans) that you can
later inject by assigning a scope to a regular class:

[source,oac_no_warn]
----
@javax.enterprise.context.RequestScoped
public class CurrencyConverter { ... }
----

Use the `javax.inject.Inject` annotation to inject managed beans; for
example:

[source,oac_no_warn]
----
public class MyServlet extends HttpServlet {
    @Inject CurrencyConverter cc;
    ...
}
----

As opposed to resource injection, dependency injection is typesafe
because it resolves by type. To decouple your code from the
implementation of the managed bean, you can reference the injected
instances using an interface type and have your managed bean implement
that interface.

For more information about dependency injection, see
link:cdi-basic.html#GIWHB[Chapter 25, "Introduction to Contexts and
Dependency Injection for Java EE"] and JSR 299 (Contexts and Dependency
Injection for the Java EE Platform).
