• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 Google, Inc.
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 package dagger;
17 
18 import java.lang.annotation.Documented;
19 import java.lang.annotation.Retention;
20 import java.lang.annotation.Target;
21 import javax.inject.Inject;
22 import javax.inject.Provider;
23 import javax.inject.Qualifier;
24 import javax.inject.Scope;
25 import javax.inject.Singleton;
26 
27 import static java.lang.annotation.ElementType.TYPE;
28 import static java.lang.annotation.RetentionPolicy.RUNTIME;
29 
30 /**
31  * Annotates an interface or abstract class for which a fully-formed, dependency-injected
32  * implementation is to be generated from a set of {@linkplain #modules}. The generated class will
33  * have the name of the type annotated with {@code @Component} prepended with {@code Dagger}. For
34  * example, {@code @Component interface MyComponent {...}} will produce an implementation named
35  * {@code DaggerMyComponent}.
36  *
37  * <a name="component-methods">
38  * <h2>Component methods</h2>
39  * </a>
40  *
41  * <p>Every type annotated with {@code @Component} must contain at least one abstract component
42  * method. Component methods may have any name, but must have signatures that conform to either
43  * {@linkplain Provider provision} or {@linkplain MembersInjector members-injection} contracts.
44  *
45  * <a name="provision-methods">
46  * <h3>Provision methods</h3>
47  * </a>
48  *
49  * <p>Provision methods have no parameters and return an {@link Inject injected} or
50  * {@link Provides provided} type. Each method may have a {@link Qualifier} annotation as well. The
51  * following are all valid provision method declarations: <pre><code>
52  *   SomeType getSomeType();
53  *   {@literal Set<SomeType>} getSomeTypes();
54  *   {@literal @PortNumber} int getPortNumber();
55  * </code></pre>
56  *
57  * <p>Provision methods, like typical {@link Inject injection} sites, may use {@link Provider} or
58  * {@link Lazy} to more explicitly control provision requests. A {@link Provider} allows the user
59  * of the component to request provision any number of times by calling {@link Provider#get}. A
60  * {@link Lazy} will only ever request a single provision, but will defer it until the first call to
61  * {@link Lazy#get}. The following provision methods all request provision of the same type, but
62  * each implies different semantics: <pre><code>
63  *   SomeType getSomeType();
64  *   {@literal Provider<SomeType>} getSomeTypeProvider();
65  *   {@literal Lazy<SomeType>} getLazySomeType();
66  * </code></pre>
67  *
68  * <a name="members-injection-methods">
69  * <h3>Members-injection methods</h3>
70  * </a>
71  *
72  * <p>Members-injection methods have a single parameter and inject dependencies into each of the
73  * {@link Inject}-annotated fields and methods of the passed instance. A members-injection method
74  * may be void or return its single parameter as a convenience for chaining. The following are all
75  * valid members-injection method declarations: <pre><code>
76  *   void injectSomeType(SomeType someType);
77  *   SomeType injectAndReturnSomeType(SomeType someType);
78  * </code></pre>
79  *
80  * <p>A method with no parameters that returns a {@link MembersInjector} is equivalent to a members
81  * injection method. Calling {@link MembersInjector#injectMembers} on the returned object will
82  * perform the same work as a members injection method. For example: <pre><code>
83  *   {@literal MembersInjector<SomeType>} getSomeTypeMembersInjector();
84  * </code></pre>
85  *
86  * <h4>A note about covariance</h4>
87  *
88  * <p>While a members-injection method for a type will accept instances of its subtypes, only
89  * {@link Inject}-annotated members of the parameter type and its supertypes will be injected;
90  * members of subtypes will not. For example, given the following types, only {@code a} and
91  * {@code b} will be injected into an instance of {@code Child} when it is passed to the
92  * members-injection method {@code injectSelf(Self instance)}: <pre><code>
93  *   class Parent {
94  *     {@literal @}Inject A a;
95  *   }
96  *
97  *   class Self extends Parent {
98  *     {@literal @}Inject B b;
99  *   }
100  *
101  *   class Child extends Self {
102  *     {@literal @}Inject C c;
103  *   }
104  * </code></pre>
105  *
106  * <a name="instantiation">
107  * <h2>Instantiation</h2>
108  * </a>
109  *
110  * <p>Component implementations are primarily instantiated via a generated
111  * <a href="http://en.wikipedia.org/wiki/Builder_pattern">builder</a>. An instance of the builder
112  * is obtained using the {@code builder()} method on the component implementation.
113  * If a nested {@code @Component.Builder} type exists in the component, the {@code builder()}
114  * method will return a generated implementation of that type.  If no nested
115  * {@code @Component.Builder} exists, the returned builder has a method to set each of the
116  * {@linkplain #modules} and component {@linkplain #dependencies} named with the
117  * <a href="http://en.wikipedia.org/wiki/CamelCase">lower camel case</a> version of the module
118  * or dependency type. Each component dependency and module without a visible default constructor
119  * must be set explicitly, but any module with a default or no-args constructor accessible to the
120  * component implementation may be elided. This is an example usage of a component builder:
121  * <pre><code>
122  *   public static void main(String[] args) {
123  *     OtherComponent otherComponent = ...;
124  *     MyComponent component = DaggerMyComponent.builder()
125  *         // required because component dependencies must be set
126  *         .otherComponent(otherComponent)
127  *         // required because FlagsModule has constructor parameters
128  *         .flagsModule(new FlagsModule(args))
129  *         // may be elided because a no-args constructor is visible
130  *         .myApplicationModule(new MyApplicationModule())
131  *         .build();
132  *   }
133  * </code></pre>
134  *
135  * <p>In the case that a component has no component dependencies and only no-arg modules, the
136  * generated component will also have a factory method {@code create()}.
137  * {@code SomeComponent.create()} and {@code SomeComponent.builder().build()} are both valid and
138  * equivalent.
139  *
140  * <a name="scope">
141  * <h2>Scope</h2>
142  * </a>
143  *
144  * <p>Each Dagger component can be associated with a scope by annotating it with the
145  * {@linkplain Scope scope annotation}. The component implementation ensures that there is only one
146  * provision of each scoped binding per instance of the component. If the component declares a
147  * scope, it may only contain unscoped bindings or bindings of that scope anywhere in the graph. For
148  * example: <pre><code>
149  *   {@literal @}Singleton {@literal @}Component
150  *   interface MyApplicationComponent {
151  *     // this component can only inject types using unscoped or {@literal @}Singleton bindings
152  *   }
153  * </code></pre>
154  *
155  * <p>In order to get the proper behavior associated with a scope annotation, it is the caller's
156  * responsibility to instantiate new component instances when appropriate. A {@link Singleton}
157  * component, for instance, should only be instantiated once per application, while a
158  * {@code RequestScoped} component should be instantiated once per request. Because components are
159  * self-contained implementations, exiting a scope is as simple as dropping all references to the
160  * component instance.
161  *
162  * <a name="component-relationships">
163  * <h2>Component relationships</h2>
164  * </a>
165  *
166  * <p>While there is much utility in isolated components with purely unscoped bindings, many
167  * applications will call for multiple components with multiple scopes to interact. Dagger provides
168  * two mechanisms for relating components.
169  *
170  * <a name="subcomponents">
171  * <h3>Subcomponents</h3>
172  * </a>
173  *
174  * <p>The simplest way to relate two components is by declaring a {@link Subcomponent}. A
175  * subcomponent behaves exactly like a component, but has its implementation generated within
176  * a parent component or subcomponent. That relationship allows the subcomponent implementation to
177  * inherit the <em>entire</em> binding graph from its parent when it is declared. For that reason,
178  * a subcomponent isn't evaluated for completeness until it is associated with a parent.
179  *
180  * <p>Subcomponents are declared via a factory method on a parent component or subcomponent. The
181  * method may have any name, but must return the subcomponent. The factory method's parameters may
182  * be any number of the subcomponent's modules, but must at least include those without visible
183  * no-arg constructors. The following is an example of a factory method that creates a
184  * request-scoped subcomponent from a singleton-scoped parent: <pre><code>
185  *   {@literal @}Singleton {@literal @}Component
186  *   interface ApplicationComponent {
187  *     // component methods...
188  *
189  *     RequestComponent newRequestComponent(RequestModule requestModule);
190  *   }
191  * </code></pre>
192  *
193  * <a name="component-dependencies">
194  * <h3>Component dependencies</h3>
195  * </a>
196  *
197  * <p>While subcomponents are the simplest way to compose subgraphs of bindings, subcomponents are
198  * tightly coupled with the parents; they may use any binding defined by their ancestor component
199  * and subcomponents. As an alternative, components can use bindings only from another
200  * <em>component interface</em> by declaring a {@linkplain #dependencies component dependency}. When
201  * a type is used as a component dependency, each <a href="#provision-methods">provision method</a>
202  * on the dependency is bound as a provider. Note that <em>only</em> the bindings exposed as
203  * provision methods are available through component dependencies.
204  *
205  * @author Gregory Kick
206  * @since 2.0
207  */
208 @Retention(RUNTIME) // Allows runtimes to have specialized behavior interoperating with Dagger.
209 @Target(TYPE)
210 @Documented
211 public @interface Component {
212   /**
213    * A list of classes annotated with {@link Module} whose bindings are used to generate the
214    * component implementation. Note that through the use of {@link Module#includes} the full set of
215    * modules used to implement the component may include more modules that just those listed here.
216    */
modules()217   Class<?>[] modules() default {};
218 
219   /**
220    * A list of types that are to be used as <a href="#component-dependencies">component
221    * dependencies</a>.
222    */
dependencies()223   Class<?>[] dependencies() default {};
224 
225   /**
226    * A builder for a component. Components may have a single nested static abstract class or
227    * interface annotated with {@code @Component.Builder}.  If they do, then the component's
228    * generated builder will match the API in the type.  Builders must follow some rules:
229    * <ul>
230    * <li> A single abstract method with no arguments must exist, and must return the component.
231    *      (This is typically the {@code build()} method.)
232    * <li> All other abstract methods must take a single argument and must return void,
233    *      the Builder type, or a supertype of the builder.
234    * <li> Each component dependency <b>must</b> have an abstract setter method.
235    * <li> Each module dependency that Dagger can't instantiate itself (e.g, the module
236    *      doesn't have a visible no-args constructor) <b>must</b> have an abstract setter method.
237    *      Other module dependencies (ones that Dagger can instantiate) are allowed, but not required.
238    * <li> Non-abstract methods are allowed, but ignored as far as validation and builder generation
239    *      are concerned.
240    * </ul>
241    *
242    * For example, this could be a valid Component with a Builder: <pre><code>
243    * {@literal @}Component(modules = {BackendModule.class, FrontendModule.class})
244    * interface MyComponent {
245    *   MyWidget myWidget();
246    *
247    *   {@literal @}Component.Builder
248    *   interface Builder {
249    *     MyComponent build();
250    *     Builder backendModule(BackendModule bm);
251    *     Builder frontendModule(FrontendModule fm);
252    *   }
253    * }</code></pre>
254    */
255   @Target(TYPE)
256   @Documented
257   @interface Builder {}
258 }
259