gpt4 book ai didi

java - 使用带有静态绑定(bind)参数的 google guice

转载 作者:行者123 更新时间:2023-12-01 09:47:49 24 4
gpt4 key购买 nike

我想用 guice 绑定(bind)一些参数,就像 guice 将未注释的 Injector 类绑定(bind)到调用注入(inject)器实例以与提供程序一起使用一样。

特别是,在我们的项目中,我们有一个名为 ResourceEnvironment 的对象,该对象实际上是方法 Class.getClassLoader().getResource() 的包装器,使我们能够优雅地将“com-paths”(类相对资源路径)转换为它们所代表的资源(FXML 文件、图像文件等)。我们用它来加载在我们的 jar 中部署的资源。

现在,这段代码被大量重复:

Class ClazzX{

private final ResourceEnvironment env;

@Inject
public ClazzX(ResourceEnvironment.Factory envFactory){
env = envFactory.create(this.getClass())
}
}

当我真正想做的事情更简单时:

Class ClazzX{

private @Inject ResourceEnvironment env;

}

但要做到这一点,我实际上需要一个提供者:

binder.install(new Module(){

@Provides ResourceEnvironment getResourceEnv(Injector callingInjector){
Class targetClazz = callingInjector.getDependencyBeingResolved(); //not a real method
ResourceEnivonment.Factory factory = callingInjector.getInstance(RE.F.class)
return factory.create(targetClazz);
}
});

是否可以在运行时获取有关当前通过注入(inject)器解析的类型的一些信息?

最佳答案

使用记录器的自定义注入(inject)作为模板( https://github.com/google/guice/wiki/CustomInjections ),应该很容易实现使用声明类作为环境注入(inject)源的特定成员注入(inject)器。据我所知,这也需要自定义注释。

class ResourceEnvironmentMembersInjector<T> implements MembersInjector<T> {
private final Field field;
private final ResourceEnvironment env;

ResourceEnvironmentMembersInjector(Field field) {
this.field = field;
env = envFactory.create(field.getDeclaringClass());
field.setAccessible(true);
}

public void injectMembers(T t) {
try {
field.set(t, env);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}

关于java - 使用带有静态绑定(bind)参数的 google guice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37846276/

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