我使用一个外部服务来提供属性,但是希望使这些属性作为@Named(..) vars可用。尝试在配置方法中使用npe:
执行此操作失败。Names.bindProperties(binder(), myPropRetriever.getProperties());
失败是因为直到向导完成它的工作才出现mypropretriiever。我可以理解为什么这是有道理的-有人知道任何时髦的黑客可能会解决这个问题吗?在这种情况下会很方便…
感谢durron597提供的相关问题的指针,这给了我足够的答案。答案是使用子注入器对上一个注入器的输出执行操作。在下面的例子:
Injector propInjector = Guice.createInjector(new PropertiesModule());
PropertiesService propService = propInjector.getInstance(PropertiesService.class);
Injector injector = propInjector.createChildInjector(new MyModule(Objects.firstNonNull(propService.getProperties(), new Properties())));
注入器现在是应用其余部分的注入器。
然后在MyModule中,你可以对创建的对象执行操作:
public class MyModule extends AbstractModule {
private final Properties properties;
public MyModule(Properties properties){
this.properties=properties;
}
@Override
protected void configure() {
// export all the properties as bindings
Names.bindProperties(binder(), properties);
// move on to bindings
// bind(..);
}
}
如果它对其他人有帮助…!