Guice 检测未使用的绑定

Guice detect unused bindings

我刚刚继承了一个很大的代码库。我正在清理并尝试删除不必要的依赖项。

有没有办法找到注入器中定义的不必要的依赖项?

您可以使用 Elements SPI,它允许您在 运行 注入器中遍历 Guice 的绑定。但是请记住,Guice 在运行时以反射方式评估您的树。这允许您添加绑定并依赖于 JIT(即时)绑定,但也使得 Guice 可能永远不会意识到 类 您不依赖于您的注入器。

在病态情况下,您可能没有定义任何模块并通过 JIT 绑定依赖所有内容,此时任何未使用的绑定检测器都会 return 空集(漏报)。相反,如果您大量使用 getInstance 或相关的 Injector 方法,但在扫描未使用的依赖项之前不执行它们,您可能 return 许多依赖项最终无法安全删除(误报)。这一点尤其正确,因为 Injector 是可注入的,所以如果您有一个旧版服务定位器(等)的适配器,您可能会发现很难预测您的 Injector 的所有使用方式。

为避免意外,您可以致电 requireExplicitBindings(), which applies to the entire Injector and its children but not its parents or siblings. This would cause all JIT bindings to need definition, even if only through an untargeted binding。您还可以扫描 getInstancegetProvidergetMembersInjectorinjectMembers 对 Injector 的调用,并通过重构减少它们。

现有解决方案似乎在 bonifaido's guice-unused github tree 中公开可用,它通过显式请求您的根绑定请求并重用 Guice 的内置依赖关系图传递访问者来避​​免上述一些问题。 免责声明:这不是我的代码。它很简单,但我不能保证它的安全性或知识分子的地位 属性.