我试图理解依赖注入并没有完全理解它,除了我已经设法理解它使得很难理解别人的代码。 :'(
无论如何,我不确定如何简要描述我的问题,但我会尝试。我目前是唯一一个致力于Java项目的程序员,这个项目已经被大约六年的数十名孤独者所使用。它大量使用了Google的Guice库。我应该采用一些现有的代码并以不同的方式实现它;具体来说,使用现有的密码验证方法,而不是将其应用于JMenu中的每个JMenuItem,将其应用于整个JMenu,这样如果输入了错误的密码或没有输入密码,则禁用所有JMenuItems。如果密码错误,就不会发生这种情况,这让我相信问题出现在if语句中,if语句本身就是一长串依赖项:
if (!ViewScanApp.getApplication().getHistoryManager().isAuthenticated())
我追溯到这一步,发现HistoryManager
类是一个接口,我的路径似乎死了;那里没有代码,也没有引用任何其他类。我通过随机探索项目中的100多个类找到了路径的终点,但我似乎无法将它们连接起来。我无法找到我在堆栈另一端找到的第一个类AccessManagerImpl
被调用的地方。
我可以使用可能适用于这种情况的依赖注入的解释。非常感谢你!
答案 0 :(得分:3)
假设@ImplementedBy
界面上没有HistoryManager
注释,您需要检查负责绑定此类型的Guice Module
。
在Eclipse中,有一个命令可以查找类的出现次数。我敢打赌,Netbeans有类似的东西。用它来查找HistoryManager
的出现次数。其中至少有一个应该出现在实现com.google.inject.Module
(或扩展AbstractModule
)的类中。您可能会看到类似
protected void configure() {
…
bind(HistoryManager.class).to(HistoryManagerImpl.class);
…
}
或者,如果你喜欢快速而又肮脏的经验主义,你可以投入println()
:
HistoryManager mgr = ViewScanApp.getApplication().getHistoryManager();
System.out.println("HistoryManager implementation: " + mgr.getClass());
if (!mgr.isAuthenticated())
…
无论你找到它,HistoryManagerImpl
课程都是你想要去的地方。
我没有使用它,但Guice graphing tool也可能有用。
答案 1 :(得分:1)
启动调试器。它将引导您完成实现该接口的确切类(假设您有源代码)
答案 2 :(得分:1)
每当你在Eclipse中有一个注入了Guice的接口定义,而不是使用F3来进行定义,如果它是一个类,你将使用Ctrl-T来选择该接口的实现。
如果您有多个可供选择,那么您需要打印出模块绑定,以便您知道要选择哪一个。不幸的是,Eclipse还不了解注射剂。