• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 The Dagger Authors.
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 package dagger;
18 
19 import static java.lang.annotation.ElementType.TYPE;
20 import static java.lang.annotation.RetentionPolicy.RUNTIME;
21 
22 import java.lang.annotation.Documented;
23 import java.lang.annotation.Retention;
24 import java.lang.annotation.Target;
25 import javax.inject.Inject;
26 import javax.inject.Provider;
27 import javax.inject.Qualifier;
28 import javax.inject.Scope;
29 import javax.inject.Singleton;
30 
31 /**
32  * Annotates an interface or abstract class for which a fully-formed, dependency-injected
33  * implementation is to be generated from a set of {@linkplain #modules}. The generated class will
34  * have the name of the type annotated with {@code @Component} prepended with {@code Dagger}. For
35  * example, {@code @Component interface MyComponent {...}} will produce an implementation named
36  * {@code DaggerMyComponent}.
37  *
38  * <a name="component-methods"></a>
39  * <h2>Component methods</h2>
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"></a>
46  * <h3>Provision methods</h3>
47  *
48  * <p>Provision methods have no parameters and return an {@link Inject injected} or {@link Provides
49  * provided} type. Each method may have a {@link Qualifier} annotation as well. The following are
50  * all valid provision method declarations:
51  *
52  * <pre><code>
53  *   SomeType getSomeType();
54  *   {@literal Set<SomeType>} getSomeTypes();
55  *   {@literal @PortNumber} int getPortNumber();
56  * </code></pre>
57  *
58  * <p>Provision methods, like typical {@link Inject injection} sites, may use {@link Provider} or
59  * {@link Lazy} to more explicitly control provision requests. A {@link Provider} allows the user of
60  * the component to request provision any number of times by calling {@link Provider#get}. A {@link
61  * Lazy} will only ever request a single provision, but will defer it until the first call to {@link
62  * Lazy#get}. The following provision methods all request provision of the same type, but each
63  * implies different semantics:
64  *
65  * <pre><code>
66  *   SomeType getSomeType();
67  *   {@literal Provider<SomeType>} getSomeTypeProvider();
68  *   {@literal Lazy<SomeType>} getLazySomeType();
69  * </code></pre>
70  *
71  * <a name="members-injection-methods"></a>
72  * <h3>Members-injection methods</h3>
73  *
74  * <p>Members-injection methods have a single parameter and inject dependencies into each of the
75  * {@link Inject}-annotated fields and methods of the passed instance. A members-injection method
76  * may be void or return its single parameter as a convenience for chaining. The following are all
77  * valid members-injection method declarations:
78  *
79  * <pre><code>
80  *   void injectSomeType(SomeType someType);
81  *   SomeType injectAndReturnSomeType(SomeType someType);
82  * </code></pre>
83  *
84  * <p>A method with no parameters that returns a {@link MembersInjector} is equivalent to a members
85  * injection method. Calling {@link MembersInjector#injectMembers} on the returned object will
86  * perform the same work as a members injection method. For example:
87  *
88  * <pre><code>
89  *   {@literal MembersInjector<SomeType>} getSomeTypeMembersInjector();
90  * </code></pre>
91  *
92  * <h4>A note about covariance</h4>
93  *
94  * <p>While a members-injection method for a type will accept instances of its subtypes, only {@link
95  * Inject}-annotated members of the parameter type and its supertypes will be injected; members of
96  * subtypes will not. For example, given the following types, only {@code a} and {@code b} will be
97  * injected into an instance of {@code Child} when it is passed to the members-injection method
98  * {@code injectSelf(Self instance)}:
99  *
100  * <pre><code>
101  *   class Parent {
102  *     {@literal @}Inject A a;
103  *   }
104  *
105  *   class Self extends Parent {
106  *     {@literal @}Inject B b;
107  *   }
108  *
109  *   class Child extends Self {
110  *     {@literal @}Inject C c;
111  *   }
112  * </code></pre>
113  *
114  * <a name="instantiation"></a>
115  * <h2>Instantiation</h2>
116  *
117  * <p>Component implementations are primarily instantiated via a generated <a
118  * href="http://en.wikipedia.org/wiki/Builder_pattern">builder</a> or <a
119  * href="https://en.wikipedia.org/wiki/Factory_(object-oriented_programming)">factory</a>.
120  *
121  * <p>If a nested {@link Builder @Component.Builder} or {@link Factory @Component.Factory} type
122  * exists in the component, Dagger will generate an implementation of that type. If neither exists,
123  * Dagger will generate a builder type that has a method to set each of the {@linkplain #modules}
124  * and component {@linkplain #dependencies} named with the <a
125  * href="http://en.wikipedia.org/wiki/CamelCase">lower camel case</a> version of the module or
126  * dependency type.
127  *
128  * <p>In either case, the Dagger-generated component type will have a static method, named either
129  * {@code builder()} or {@code factory()}, that returns a builder or factory instance.
130  *
131  * <p>Example of using a builder:
132  *
133  * <pre>{@code
134  *   public static void main(String[] args) {
135  *     OtherComponent otherComponent = ...;
136  *     MyComponent component = DaggerMyComponent.builder()
137  *         // required because component dependencies must be set
138  *         .otherComponent(otherComponent)
139  *         // required because FlagsModule has constructor parameters
140  *         .flagsModule(new FlagsModule(args))
141  *         // may be elided because a no-args constructor is visible
142  *         .myApplicationModule(new MyApplicationModule())
143  *         .build();
144  *   }
145  * }</pre>
146  *
147  * <p>Example of using a factory:
148  *
149  * <pre>{@code
150  * public static void main(String[] args) {
151  *     OtherComponent otherComponent = ...;
152  *     MyComponent component = DaggerMyComponent.factory()
153  *         .create(otherComponent, new FlagsModule(args), new MyApplicationModule());
154  *     // Note that all parameters to a factory method are required, even if one is for a module
155  *     // that Dagger could instantiate. The only case where null is legal is for a
156  *     // @BindsInstance @Nullable parameter.
157  *   }
158  * }</pre>
159  *
160  * <p>In the case that a component has no component dependencies and only no-arg modules, the
161  * generated component will also have a factory method {@code create()}. {@code
162  * SomeComponent.create()} and {@code SomeComponent.builder().build()} are both valid and
163  * equivalent.
164  *
165  * <a name="scope"></a>
166  * <h2>Scope</h2>
167  *
168  * <p>Each Dagger component can be associated with a scope by annotating it with the {@linkplain
169  * Scope scope annotation}. The component implementation ensures that there is only one provision of
170  * each scoped binding per instance of the component. If the component declares a scope, it may only
171  * contain unscoped bindings or bindings of that scope anywhere in the graph. For example:
172  *
173  * <pre><code>
174  *   {@literal @}Singleton {@literal @}Component
175  *   interface MyApplicationComponent {
176  *     // this component can only inject types using unscoped or {@literal @}Singleton bindings
177  *   }
178  * </code></pre>
179  *
180  * <p>In order to get the proper behavior associated with a scope annotation, it is the caller's
181  * responsibility to instantiate new component instances when appropriate. A {@link Singleton}
182  * component, for instance, should only be instantiated once per application, while a {@code
183  * RequestScoped} component should be instantiated once per request. Because components are
184  * self-contained implementations, exiting a scope is as simple as dropping all references to the
185  * component instance.
186  *
187  * <a name="component-relationships"></a>
188  * <h2>Component relationships</h2>
189  *
190  * <p>While there is much utility in isolated components with purely unscoped bindings, many
191  * applications will call for multiple components with multiple scopes to interact. Dagger provides
192  * two mechanisms for relating components.
193  *
194  * <a name="subcomponents"></a>
195  * <h3>Subcomponents</h3>
196  *
197  * <p>The simplest way to relate two components is by declaring a {@link Subcomponent}. A
198  * subcomponent behaves exactly like a component, but has its implementation generated within a
199  * parent component or subcomponent. That relationship allows the subcomponent implementation to
200  * inherit the <em>entire</em> binding graph from its parent when it is declared. For that reason, a
201  * subcomponent isn't evaluated for completeness until it is associated with a parent.
202  *
203  * <p>Subcomponents are declared by listing the class in the {@link Module#subcomponents()}
204  * attribute of one of the parent component's modules. This binds the {@link Subcomponent.Builder}
205  * or {@link Subcomponent.Factory} for that subcomponent within the parent component.
206  *
207  * <p>Subcomponents may also be declared via a factory method on a parent component or subcomponent.
208  * The method may have any name, but must return the subcomponent. The factory method's parameters
209  * may be any number of the subcomponent's modules, but must at least include those without visible
210  * no-arg constructors. The following is an example of a factory method that creates a
211  * request-scoped subcomponent from a singleton-scoped parent:
212  *
213  * <pre><code>
214  *   {@literal @}Singleton {@literal @}Component
215  *   interface ApplicationComponent {
216  *     // component methods...
217  *
218  *     RequestComponent newRequestComponent(RequestModule requestModule);
219  *   }
220  * </code></pre>
221  *
222  * <a name="component-dependencies"></a>
223  * <h3>Component dependencies</h3>
224  *
225  * <p>While subcomponents are the simplest way to compose subgraphs of bindings, subcomponents are
226  * tightly coupled with the parents; they may use any binding defined by their ancestor component
227  * and subcomponents. As an alternative, components can use bindings only from another <em>component
228  * interface</em> by declaring a {@linkplain #dependencies component dependency}. When a type is
229  * used as a component dependency, each <a href="#provision-methods">provision method</a> on the
230  * dependency is bound as a provider. Note that <em>only</em> the bindings exposed as provision
231  * methods are available through component dependencies.
232  *
233  * @since 2.0
234  */
235 @Retention(RUNTIME) // Allows runtimes to have specialized behavior interoperating with Dagger.
236 @Target(TYPE)
237 @Documented
238 public @interface Component {
239   /**
240    * A list of classes annotated with {@link Module} whose bindings are used to generate the
241    * component implementation. Note that through the use of {@link Module#includes} the full set of
242    * modules used to implement the component may include more modules that just those listed here.
243    */
modules()244   Class<?>[] modules() default {};
245 
246   /**
247    * A list of types that are to be used as <a href="#component-dependencies">component
248    * dependencies</a>.
249    */
dependencies()250   Class<?>[] dependencies() default {};
251 
252   /**
253    * A builder for a component.
254    *
255    * <p>A builder is a type with setter methods for the {@linkplain Component#modules modules},
256    * {@linkplain Component#dependencies dependencies} and {@linkplain BindsInstance bound instances}
257    * required by the component and a single no-argument build method that creates a new component
258    * instance.
259    *
260    * <p>Components may have a single nested {@code static abstract class} or {@code interface}
261    * annotated with {@code @Component.Builder}. If they do, then Dagger will generate a builder
262    * class that implements that type. Note that a component with a {@code @Component.Builder} may
263    * not also have a {@code @Component.Factory}.
264    *
265    * <p>Builder types must follow some rules:
266    *
267    * <ul>
268    *   <li>There <i>must</i> be exactly one abstract no-argument method that returns the component
269    *       type or one of its supertypes, called the "build method".
270    *   <li>There <i>may</i> be other other abstract methods, called "setter methods".
271    *   <li>Setter methods <i>must</i> take a single argument and return {@code void}, the builder
272    *       type or a supertype of the builder type.
273    *   <li>There <i>must</i> be a setter method for each {@linkplain Component#dependencies
274    *       component dependency}.
275    *   <li>There <i>must</i> be a setter method for each non-{@code abstract} {@linkplain
276    *       Component#modules module} that has non-{@code static} binding methods, unless Dagger can
277    *       instantiate that module with a visible no-argument constructor.
278    *   <li>There <i>may</i> be setter methods for modules that Dagger can instantiate or does not
279    *       need to instantiate.
280    *   <li>There <i>may</i> be setter methods annotated with {@code @BindsInstance}. These methods
281    *       bind the instance passed to them within the component. See {@link
282    *       BindsInstance @BindsInstance} for more information.
283    *   <li>There <i>may</i> be non-{@code abstract} methods, but they are ignored as far as
284    *       validation and builder generation are concerned.
285    * </ul>
286    *
287    * For example, this could be a valid {@code Component} with a {@code Builder}:
288    *
289    * <pre><code>
290    * {@literal @}Component(modules = {BackendModule.class, FrontendModule.class})
291    * interface MyComponent {
292    *   MyWidget myWidget();
293    *
294    *   {@literal @}Component.Builder
295    *   interface Builder {
296    *     Builder backendModule(BackendModule bm);
297    *     Builder frontendModule(FrontendModule fm);
298    *     {@literal @}BindsInstance
299    *     Builder foo(Foo foo);
300    *     MyComponent build();
301    *   }
302    * }</code></pre>
303    */
304   @Retention(RUNTIME) // Allows runtimes to have specialized behavior interoperating with Dagger.
305   @Target(TYPE)
306   @Documented
307   @interface Builder {}
308 
309   /**
310    * A factory for a component.
311    *
312    * <p>A factory is a type with a single method that returns a new component instance each time it
313    * is called. The parameters of that method allow the caller to provide the {@linkplain
314    * Component#modules modules}, {@linkplain Component#dependencies dependencies} and {@linkplain
315    * BindsInstance bound instances} required by the component.
316    *
317    * <p>Components may have a single nested {@code static abstract class} or {@code interface}
318    * annotated with {@code @Component.Factory}. If they do, then Dagger will generate a factory
319    * class that will implement that type. Note that a component with a {@code @Component.Factory}
320    * may not also have a {@code @Component.Builder}.
321    *
322    * <p>Factory types must follow some rules:
323    *
324    * <ul>
325    *   <li>There <i>must</i> be exactly one abstract method, which must return the component type or
326    *       one of its supertypes.
327    *   <li>The method <i>must</i> have a parameter for each {@linkplain Component#dependencies
328    *       component dependency}.
329    *   <li>The method <i>must</i> have a parameter for each non-{@code abstract} {@linkplain
330    *       Component#modules module} that has non-{@code static} binding methods, unless Dagger can
331    *       instantiate that module with a visible no-argument constructor.
332    *   <li>The method <i>may</i> have parameters for modules that Dagger can instantiate or does not
333    *       need to instantiate.
334    *   <li>The method <i>may</i> have parameters annotated with {@code @BindsInstance}. These
335    *       parameters bind the instance passed for that parameter within the component. See {@link
336    *       BindsInstance @BindsInstance} for more information.
337    *   <li>There <i>may</i> be non-{@code abstract} methods, but they are ignored as far as
338    *       validation and factory generation are concerned.
339    * </ul>
340    *
341    * For example, this could be a valid {@code Component} with a {@code Factory}:
342    *
343    * <pre><code>
344    * {@literal @}Component(modules = {BackendModule.class, FrontendModule.class})
345    * interface MyComponent {
346    *   MyWidget myWidget();
347    *
348    *   {@literal @}Component.Factory
349    *   interface Factory {
350    *     MyComponent newMyComponent(
351    *         BackendModule bm, FrontendModule fm, {@literal @}BindsInstance Foo foo);
352    *   }
353    * }</code></pre>
354    *
355    * <p>For a root component, if a {@code @Component.Factory} is defined, the generated component
356    * type will have a {@code static} method named {@code factory()} that returns an instance of that
357    * factory.
358    *
359    * @since 2.22
360    */
361   @Retention(RUNTIME) // Allows runtimes to have specialized behavior interoperating with Dagger.
362   @Target(TYPE)
363   @Documented
364   @interface Factory {}
365 }
366