Guice DI绑定而不添加Guice注释

时间:2017-11-12 20:22:31

标签: java spring dependency-injection guice inject

我有一个用例,我使用的是基于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方法中的setter设置成员,但@inject成员为null,我得到countEvent和durationEvent的NullPointerException。

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

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

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

1 个答案:

答案 0 :(得分:2)

注入MembersInjector  在Guice不创建的对象上填充@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实例。但是,这里的最佳做法是尽可能地注入界面,以便阅读清晰,易于嘲笑。