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