/* * Copyright (C) 2020 The Dagger Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package dagger.assisted; import static java.lang.annotation.ElementType.CONSTRUCTOR; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; /** * Annotates the constuctor of a type that will be created via assisted injection. * *
Note that an assisted injection type cannot be scoped. In addition, assisted injection * requires the use of a factory annotated with {@link AssistedFactory} (see the example below). * *
Example usage: * *
Suppose we have a type, {@code DataService}, that has two dependencies: {@code DataFetcher} * and {@code Config}. When creating {@code DataService}, we would like to pass in an instance of * {@code Config} manually rather than having Dagger create it for us. This can be done using * assisted injection. * *
To start, we annotate the {@code DataService} constructor with {@link AssistedInject} and we * annotate the {@code Config} parameter with {@link Assisted}, as shown below: * *
* final class DataService {
* private final DataFetcher dataFetcher;
* private final Config config;
*
* {@literal @}AssistedInject
* DataService(DataFetcher dataFetcher, {@literal @}Assisted Config config) {
* this.dataFetcher = dataFetcher;
* this.config = config;
* }
* }
*
*
* Next, we define a factory for the assisted type, {@code DataService}, and annotate it with * {@link AssistedFactory}. The factory must contain a single abstract, non-default method which * takes in all of the assisted parameters (in order) and returns the assisted type. * *
* {@literal @}AssistedFactory
* interface DataServiceFactory {
* DataService create(Config config);
* }
*
*
* Dagger will generate an implementation of the factory and bind it to the factory type. The * factory can then be used to create an instance of the assisted type: * *
* class MyApplication {
* {@literal @}Inject DataServiceFactory dataServiceFactory;
*
* dataService = dataServiceFactory.create(new Config(...));
* }
*
*/
@Documented
@Retention(RUNTIME)
@Target(CONSTRUCTOR)
public @interface AssistedInject {}