Guice:如何打印模块的绑定?

时间:2012-05-21 13:38:39

标签: java dependency-injection guice

我过去2天一直盯着我的代码中的一个讨厌的bug,围绕着我的Guice模块和我在其中声明的绑定。我在我的模块中声明了大约20个绑定,其中只有1个不起作用。

我在这里用尽每个选项,我想知道Guice库中是否有类似module.print()的方法,我可以打印出所有模块绑定的String版本;无论是那个还是以某种方式让Guice记录它在读取我有缺陷的装订时所做的事情。

3 个答案:

答案 0 :(得分:5)

Injector injector = Guice.createInjector(myModuleInstance);
Map<Key<?>,Binding<?>> map = injector.getBindings();
for(Entry<Key<?>, Binding<?>> e : map.entrySet()) {
    System.out.println(e.getKey() + ": " + e.getValue());
}

答案 1 :(得分:3)

herpylderp的解决方案应该适用于大多数情况。如果您想在不创建Injector的情况下单独查看Module(例如,如果您有一个配置错误阻止您构建Injector),您可以使用Guice SPI工具提取一组的绑定列表模块。它还可以让你做更多的事情,但这不是重点;)

请参阅: http://code.google.com/p/google-guice/wiki/ExtendingGuice#Examples

在列出的示例中,他们检查了静态注入的情况。对于这种情况,您可以执行相同操作,但改写visit(Binding)的{​​{1}}方法。

另见: http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/spi/Elements.html

另请注意,每个ElementVisitor都有一个Binding方法,在这种情况下可能会有用。

注意:我承认我之前没有尝试过这个完全的事情,所以请告诉我它是否有效。

答案 2 :(得分:0)

与上面的答案IAmYourFaja相同,但是采用更现代的风格:

import static java.util.stream.Collectors.joining;
String stringBinder = injector.getAllBindings().entrySet().stream()
            .map(e ->  e.getKey() + ": " +  e.getValue())
            .collect(joining("\n"));