gpt4 book ai didi

java - 如何避免Google guice注入(inject)器getInstance()由于null而重复调用?

转载 作者:行者123 更新时间:2023-12-01 16:41:28 24 4
gpt4 key购买 nike

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

这是我的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;
}
}

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

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);
}

最佳答案

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

1)您的 GraphQLRouter 类正在使用基于字段的注入(inject),因为 @Inject 位于该字段上,其中一个字段是静态的,这意味着您正在破坏甚至更多。

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

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

您至少可以使用:

@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?显然你可以做到这一点,但没有关于如何做到这一点的真实信息(所以我假设是前者)。再说一遍,这只是一个想法,但您需要向上移动注入(inject)器:

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 的绑定(bind),无论如何您都应该这样做。该文档讨论了如何使用 VerticleFactory,您可以自己实现它,以便:

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

经历了类似的事情:

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

这样你就可以在创建过程中注入(inject)顶点,但同样,我没有深入研究工厂,所以谁知道呢。

希望对您有所帮助。

关于java - 如何避免Google guice注入(inject)器getInstance()由于null而重复调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61853490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com