代码之家  ›  专栏  ›  技术社区  ›  itrat jameel

不添加Guice注释的Guice DI绑定

  •  3
  • itrat jameel  · 技术社区  · 7 年前

    我有一个用例,我使用一个基于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 回复  |  直到 7 年前
        1
  •  3
  •   Jeff Bowman    7 年前

    注入a MembersInjector 填充的步骤 @Inject -注释字段(和调用 @注入 -对象Guice上的注释方法)。Guice称之为 "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实例。然而,这里的最佳实践是注入尽可能窄的界面,以便于阅读和模仿。