我想用guice绑定一些参数,类似于guice将未注释的Injector
类绑定到调用注入器实例以供提供者使用。
特别是,在我们的项目中,我们有一个名为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);
}
});
是否可以在运行时获取有关当前通过进样器解析的类型的一些信息?
答案 0 :(得分:1)
使用自定义注入记录器作为模板(https://github.com/google/guice/wiki/CustomInjections),应该很容易实现使用声明类作为环境注入源的特定成员注入器。据我所知,这也需要一个自定义注释。
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);
}
}
}