我有一个用例,其中我使用的是基于Spring的外部jar,而我的代码则基于Google guice。

我试图通过编写模块在我的依赖项jar的此类中注入依赖项。

外部类:

public class PTRS {
    @Inject
    private Event countEvent;
    @Inject
    private Event durationEvent;
    private GeoServiceClient gClient;
    public void setGeoServiceClient(GeoServiceClient client){this.gClient=client}

}


我可以在模块的@provides方法中使用setters设置成员,但是@inject成员具有null,并且为countEvent和durationEvent获取NullPointerException。

我的代码使用以下提供程序类来创建要与PTRS类绑定的对象。

@Provides
PTRS new PTRS(Client client){
PTRS ptrs = new PTRS();
ptrs.setGeoServiceClient(client);
return ptrs;
}


如何在不更改外部类的情况下注入这两个依赖项?

最佳答案

注入MembersInjector
 在未创建的对象上填充@Inject注释的字段(并调用@Inject注释的方法)。 Guice在Wiki中将其称为"On-demand injection",尽管我在其他地方没有听说过该术语。

@Provides
PTRS newPTRS(Client client, MembersInjector<PTRS> ptrsInjector){
  PTRS ptrs = new PTRS();
  ptrsInjector.injectMembers(ptrs);    // <-- inject members here
  ptrs.setGeoServiceClient(client);
  return ptrs;
}


如果您有权访问本身可注射的Injector,则可以直接调用injectMembers(Class)或调用getMembersInjector以获取所选类型的MembersInjector实例。但是,此处的最佳实践是注入尽可能窄的接口,以使阅读清晰且易于模拟。

10-04 15:17