我刚刚继承了一个很大的代码库。我正在清理并尝试删除不必要的依赖项。
有没有办法找到在注射器中定义的不必要的依赖关系?
答案 0 :(得分:2)
您可以使用Elements SPI,它允许您在正在运行的Injector中遍历Guice的绑定。但是请记住,Guice在运行时会反省地评估您的树。这样,您可以添加绑定并依赖JIT(即时)绑定,而且还可以使Guice永远不会意识到您不依赖于注入器的类。
在病理情况下,您可能无法定义任何模块,并且无法通过JIT绑定依赖于所有模块,此时任何未使用的绑定检测器都将返回空集(错误否定)。相反,如果您大量使用getInstance
或相关的Injector方法,但在扫描未使用的dep之前不使用它们,则可能会返回许多依赖项,这些依赖项最终会变得不安全地删除(误报)。这是特别正确的,因为Injector是可注入的,因此,如果您有旧服务定位器(例如)的适配器,则可能很难预料到Injector的所有使用方式。
为避免意外,您可以致电requireExplicitBindings()
,该电话适用于整个喷油器及其孩子,但不适用于其父母或兄弟姐妹。这将导致所有JIT绑定都需要定义,即使仅通过untargeted binding也是如此。您还可以扫描Injector上的getInstance
,getProvider
和getMembersInjector
,以及injectMembers
调用,并通过重构减少调用。
bonifaido's guice-unused
github tree中似乎可以公开获得现有解决方案,该解决方案通过显式请求您的根绑定请求并重用Guice的内置依赖性绘图器可传递访问器,从而避免了上述问题。 免责声明:这不是我的代码。它很简单,但是我不能保证它的安全性或知识产权的地位。