【问题标题】:How to avoid Google guice injector getInstance() repetative calls due to null?如何避免由于 null 而导致 Google guice 注入器 getInstance() 重复调用?
【发布时间】:2020-05-17 14:32:45
【问题描述】:

我最近开始使用 Google guice DI 框架并且对它很陌生。 我面临以下问题 - @inject 总是返回 null 并且必须调用注入器来注入各种引用。

这是我的AbstractModule


public class AppModule extends AbstractModule {

    private static final Injector injector = Guice.createInjector(new AppModule());

    private final Vertx vertx = Vertx.vertx(new VertxOptions().setMetricsOptions(
            new DropwizardMetricsOptions().setEnabled(true)
    ));

    private final com.test.reactivex.db.service.DBService dbService;

    public AppModule() {

        this.dbService = DBService.createProxy(this.vertx, DB_SERVICE_ADDRESS);
    }

    @Override
    protected void configure() {
        bind(Vertx.class).toInstance(this.vertx);
        bind(EventBus.class).toInstance(this.vertx.eventBus());
        bind(FileSystem.class).toInstance(this.vertx.fileSystem());
        bind(SharedData.class).toInstance(this.vertx.sharedData());
        bind(com.test.reactivex.db.service.DBService.class).toInstance(this.dbService);
        bind(AppConfig.class).toProvider(AppConfigProvider.class).in(Singleton.class);
        //requestStaticInjection(AppDependenciesInjector.class);
        logger.info("Google guice module configuration done");
    }

    @Provides
    public static AppConfig appConfig() {
        return injector.getInstance(AppConfig.class);
    }

    public static Injector getInjector() {
        return injector;
    }
}

这就是我使用注入器注入依赖项的方式,但问题是我必须再次使用注入器。

public class GraphQLRouter {

    @Inject 
    private static AppConfig config;

    @Inject
    private com.test.reactivex.auth.service.DBService dbService;

    public GraphQLRouter() {
    // below code I want to avoid
        if (dbService == null) {
            dbService = AppModule.getInjector().getInstance(com.test.reactivex.auth.service.DBService.class);
        }
    }

    //below code I want to avoid
    static {
        if (config == null)
            config = AppModule.getInjector().getInstance(AppConfig.class);
    }

【问题讨论】:

  • @JeffBowman 请帮忙
  • 想知道您是否解决了这个问题?您如何以及在何处创建/注入GraphQLRouter
  • @kendavidson 仍未排序。 GraphqlRouter 我用来与主根路由器结合使用。
  • 你必须在某处初始化一个GraphqlRouter 实例。你没有在你的AppModule 中绑定它,所以我不确定你在哪里或如何使用它。如果你打电话给new GraphQLRouter(),那将永远不会被自动注入。
  • 另一个问题,您在哪里使用vertx 创建服务器并应用路由?在主要的class Application 或类似的东西?

标签: java dependency-injection guice vert.x


【解决方案1】:

这将是一个糟糕的答案,但随着更多信息的出现,我会对其进行修改。这里的重要部分是:

1) 您的 GraphQLRouter 类正在使用基于字段的注入,因为 @Inject 在该字段中,其中一个字段是静态的,这意味着您将其分解得更多。

2) 然后您尝试在构造函数中使用 dbService,这永远不会起作用 - 它总是会为空。

这完全取决于您在哪里使用它。我对 VertX 一无所知(几乎一无所知),所以如果您需要更多关于这方面的信息,我将不得不做一些谷歌搜索,但您不应该混淆所有不同类型的注入(字段、构造函数、静态) .

您至少可以使用:

@Inject
public GraphQLRouter(AppConfig config, DBService dbService) {
    this.config = config;
    this.dbService = dbService;
}

此时,您可以更好地进行测试,但我们仍然缺少您从哪里创建实例。

编辑

我在 Vert.x 上做了一些阅读并有一些想法,它们都涉及到拉线

private static final Injector injector = Guice.createInjector(new AppModule());

退出 AppConfig 并进入您的 public static void main(String[] args) {} 方法。你在用垂直吗?还是您使用没有垂直的 Vert.x?显然你可以做到,但没有关于你将如何做到这一点的真实信息(所以我假设前者)。同样,这只是一个想法,但您需要将注射器向上移动:

public class RandomVerticle extends AbstractVerticle {

  @Inject
  private GraphQLRouter router;

  @Override
  public void start() {
     // use router
  }
}

public class Application {
   public static void main(String[] args) {
       private static final Injector injector = Guice.createInjector(new AppModule());

       Vertx vertx = injector.getInstance(Vertx.class);
       vertx.deployVerticle(injector.getInstance(RandomVerticle.class));
   }
}

这需要您提供某种对 Verticles 的绑定,无论如何您都应该这样做。该文档讨论了能够使用VerticleFactory,您可以自己实现它,以便:

vertx.deployVerticle("guice:com.example.SomeVerticle");

经历了类似的事情:

public class GuiceVerticleFactory implements VerticleFactory {
   public GuiceverticleFactory(Injector injector) {
       this.injector = injector;
   }
}

所以你可以在创建过程中注入verticles,但同样,我没有深入研究Factory,所以谁知道。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    相关资源
    最近更新 更多