有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么匕首注入不起作用,而是组件。getObject是

我试图使用Dagger2来实例化一个改型接口。CloudContactDataStore类注入RestClient并调用其方法

当我实例化一个CloudContactDataStore对象时,它的RestClient属性具有null

public class CloudContactDataStore implements ContactDataStore {

    @Inject RestClient restClient;

    public CloudContactDataStore() {
        this.initializeInjector();
    }

    private void initializeInjector() {
        ApiComponent component = DaggerApiComponent.builder()
            .apiModule(new ApiModule())
            .build();

        component.inject(this); // Nothing changes, restClient is null!

        this.restClient = component.getRestClient(); // This works
    }
}

以下是我如何创建Dagger模块和组件:

@Singleton
@Component(modules = ApiModule.class)
public interface ApiComponent {
    void inject(ContactDataStore contactDataStore);

    RestClient getRestClient();
}

@Module
public class ApiModule {

    @Provides public RestClient provideRestClient(ApiService apiService) {
        return new RestClientImpl(apiService);
    }

    @Provides public ApiService provideApiService(RestAdapter restAdapter) {
        return restAdapter.create(ApiService.class);
    }

    @Provides public RestAdapter provideRestAdapter() {
        return RestApiAdapter.getInstance();
    }
}

那么,为什么inject函数不起作用,而调用componentgetRestClient()是吗


共 (1) 个答案

  1. # 1 楼答案

    我发现查看Dagger 2生成的代码非常有用,因为它非常容易理解,并且通常可以为您指出正确的方向

    Dagger2创建的代码与您编写的代码非常相似,因此请考虑如何实现ApiComponent.inject(ContactDataStore)。假设在该方法中,您可以访问RestClient,您将如何将其引入该字段?如果你坐下来写,你会注意到你必须这样做:

    ((CloudContactDataStore) contactDataStore).restClient = restClient;
    

    或者换句话说,您需要将其分解为特定的实现。匕首2从来没有放下过(至少我没见过),因为那通常是不安全的

    所以,你有两个选择。将inject(ContactDataStore)方法更改为inject(CloudContactDataStore),或者在ContactDataStore上提供一个允许传入RestClient的方法

    更新:不可能通过抽象@Inject,即接口、方法

    如果您想通过ContactDataStoreAPI注入它,那么您有一个问题,因为Dagger 2中当前有一个限制(已提出删除它的功能请求),即您不能用@Inject标记抽象方法。因此,在此期间(或者永远,如果有某种原因它无法在Dagger 2中工作),您将需要手动执行此操作,即从组件方法获取RestClient的实例,并将其传递给接口上的适当方法