java - Guice DI 绑定(bind),无需添加 Guice 注解

标签 java spring dependency-injection guice inject

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

我正在尝试通过编写模块将依赖项注入(inject)到我的依赖项 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 和urationEvent 的 NullPointerException。

我的代码使用以下提供程序类来创建一个与 PTRS 类绑定(bind)的对象。

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

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

最佳答案

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

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

如果您有权访问本身可注入(inject)的Injector,则可以调用 injectMembers(Class)直接调用,或者调用 getMembersInjector 来获取您选择的类型的 MembersInjector 实例。然而,这里的最佳实践是注入(inject)尽可能窄的接口(interface),以便阅读清晰并易于模拟。

关于java - Guice DI 绑定(bind),无需添加 Guice 注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47253540/

相关文章:

java - 在单元测试期间填充 Spring @Value

java - 字符串或简单字符串的 Jackson 映射列表

javascript - 为什么 Angular JS 中的依赖注入(inject)比手动管理依赖更好?

java - 使用 List 属性测试 Bean 时出现问题

java - 如何在获得不同范围的数字的同时放大/缩小图表?

Java Android 互联网访问 : WIFI or 3G

java - maven排除依赖中的插件

java - 不传播 Mule/Spring 事务

java - Apache Camel 与构造函数注入(inject)

c# - IoC - 构造函数将运行时值作为一个参数,将服务作为另一个参数