Home | History | Annotate | Download | only in inject
      1 /*
      2  * Copyright (C) 2009 The JSR-330 Expert Group
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /**
     18  * This package specifies a means for obtaining objects in such a way as to
     19  * maximize reusability, testability and maintainability compared to
     20  * traditional approaches such as constructors, factories, and service
     21  * locators (e.g., JNDI).&nbsp;This process, known as <i>dependency
     22  * injection</i>, is beneficial to most nontrivial applications.
     23  *
     24  * <p>Many types depend on other types. For example, a <tt>Stopwatch</tt> might
     25  * depend on a <tt>TimeSource</tt>. The types on which a type depends are
     26  * known as its <i>dependencies</i>. The process of finding an instance of a
     27  * dependency to use at run time is known as <i>resolving</i> the dependency.
     28  * If no such instance can be found, the dependency is said to be
     29  * <i>unsatisfied</i>, and the application is broken.
     30  *
     31  * <p>In the absence of dependency injection, an object can resolve its
     32  * dependencies in a few ways. It can invoke a constructor, hard-wiring an
     33  * object directly to its dependency's implementation and life cycle:
     34  *
     35  * <pre>   class Stopwatch {
     36  *     final TimeSource timeSource;
     37  *     Stopwatch () {
     38  *       timeSource = <b>new AtomicClock(...)</b>;
     39  *     }
     40  *     void start() { ... }
     41  *     long stop() { ... }
     42  *   }</pre>
     43  *
     44  * <p>If more flexibility is needed, the object can call out to a factory or
     45  * service locator:
     46  *
     47  * <pre>   class Stopwatch {
     48  *     final TimeSource timeSource;
     49  *     Stopwatch () {
     50  *       timeSource = <b>DefaultTimeSource.getInstance()</b>;
     51  *     }
     52  *     void start() { ... }
     53  *     long stop() { ... }
     54  *   }</pre>
     55  *
     56  * <p>In deciding between these traditional approaches to dependency
     57  * resolution, a programmer must make trade-offs. Constructors are more
     58  * concise but restrictive. Factories decouple the client and implementation
     59  * to some extent but require boilerplate code. Service locators decouple even
     60  * further but reduce compile time type safety. All three approaches inhibit
     61  * unit testing. For example, if the programmer uses a factory, each test
     62  * against code that depends on the factory will have to mock out the factory
     63  * and remember to clean up after itself or else risk side effects:
     64  *
     65  * <pre>   void testStopwatch() {
     66  *     <b>TimeSource original = DefaultTimeSource.getInstance();
     67  *     DefaultTimeSource.setInstance(new MockTimeSource());
     68  *     try {</b>
     69  *       // Now, we can actually test Stopwatch.
     70  *       Stopwatch sw = new Stopwatch();
     71  *       ...
     72  *     <b>} finally {
     73  *       DefaultTimeSource.setInstance(original);
     74  *     }</b>
     75  *   }</pre>
     76  *
     77  * <p>In practice, supporting this ability to mock out a factory results in
     78  * even more boilerplate code. Tests that mock out and clean up after multiple
     79  * dependencies quickly get out of hand. To make matters worse, a programmer
     80  * must predict accurately how much flexibility will be needed in the future
     81  * or else suffer the consequences. If a programmer initially elects to use a
     82  * constructor but later decides that more flexibility is required, the
     83  * programmer must replace every call to the constructor. If the programmer
     84  * errs on the side of caution and write factories up front, it may result in
     85  * a lot of unnecessary boilerplate code, adding noise, complexity, and
     86  * error-proneness.
     87  *
     88  * <p><i>Dependency injection</i> addresses all of these issues. Instead of
     89  * the programmer calling a constructor or factory, a tool called a
     90  * <i>dependency injector</i> passes dependencies to objects:
     91  *
     92  * <pre>   class Stopwatch {
     93  *     final TimeSource timeSource;
     94  *     <b>@Inject Stopwatch(TimeSource timeSource)</b> {
     95  *       this.timeSource = timeSource;
     96  *     }
     97  *     void start() { ... }
     98  *     long stop() { ... }
     99  *   }</pre>
    100  *
    101  * <p>The injector further passes dependencies to other dependencies until it
    102  * constructs the entire object graph. For example, suppose the programmer
    103  * asked an injector to create a <tt>StopwatchWidget</tt> instance:
    104  *
    105  * <pre>   /** GUI for a Stopwatch &#42;/
    106  *   class StopwatchWidget {
    107  *     &#64;Inject StopwatchWidget(Stopwatch sw) { ... }
    108  *     ...
    109  *   }</pre>
    110  *
    111  * <p>The injector might:
    112  * <ol>
    113  *   <li>Find a <tt>TimeSource</tt>
    114  *   <li>Construct a <tt>Stopwatch</tt> with the <tt>TimeSource</tt>
    115  *   <li>Construct a <tt>StopwatchWidget</tt> with the <tt>Stopwatch</tt>
    116  * </ol>
    117  *
    118  * <p>This leaves the programmer's code clean, flexible, and relatively free
    119  * of dependency-related infrastructure.
    120  *
    121  * <p>In unit tests, the programmer can now construct objects directly
    122  * (without an injector) and pass in mock dependencies. The programmer no
    123  * longer needs to set up and tear down factories or service locators in each
    124  * test. This greatly simplifies our unit test:
    125  *
    126  * <pre>   void testStopwatch() {
    127  *     Stopwatch sw = new Stopwatch(new MockTimeSource());
    128  *     ...
    129  *   }</pre>
    130  *
    131  * <p>The total decrease in unit-test complexity is proportional to the
    132  * product of the number of unit tests and the number of dependencies.
    133  *
    134  * <p><b>This package provides dependency injection annotations that enable
    135  * portable classes</b>, but it leaves external dependency configuration up to
    136  * the injector implementation. Programmers annotate constructors, methods,
    137  * and fields to advertise their injectability (constructor injection is
    138  * demonstrated in the examples above). A dependency injector identifies a
    139  * class's dependencies by inspecting these annotations, and injects the
    140  * dependencies at run time. Moreover, the injector can verify that all
    141  * dependencies have been satisfied at <i>build time</i>. A service locator,
    142  * by contrast, cannot detect unsatisfied dependencies until run time.
    143  *
    144  * <p>Injector implementations can take many forms. An injector could
    145  * configure itself using XML, annotations, a DSL (domain-specific language),
    146  * or even plain Java code. An injector could rely on reflection or code
    147  * generation. An injector that uses compile-time code generation may not even
    148  * have its own run time representation. Other injectors may not be able to
    149  * generate code at all, neither at compile nor run time. A "container", for
    150  * some definition, can be an injector, but this package specification aims to
    151  * minimize restrictions on injector implementations.
    152  *
    153  * @see javax.inject.Inject @Inject
    154  */
    155 package javax.inject;
    156