我的核心申请已经完成。我能够成功加载模块,但我仍然无法正确使用guice在我的模块中注入依赖项。我的核心应用程序使用服务加载器来加载模块,并使用guice的AbstractModule的安装方法安装它们。以下是示例代码:(简化)
@Override
protected void configure() {
ServiceLoader<IModule> modules = ServiceLoader.load(IModule, ucl);
for (IModule module : modules) {
install(module);
}
}
每个模块都实现了IModule接口,扩展了guice的Module接口。令我困惑的是,如果不建议在整个地方安装注射器,我如何提供插件实例(例如视图实例)。我读到了@Provides注释,我认为这是一个可能的解决方案,但我面临的另一个问题是它们中的一些有需要注入的依赖项。例如,我的pluginview注入一个插件控制器的实例。鉴于这种情况,我不确定如何使用提供程序接口。建议真的值得赞赏
public PlugIn implements IModule{
@Override
public void configure(Binder binder){
binder.bind(View.class).to(PlugInView.class);
}
public View getView(){
//Should return a view instance
//Still unsure how to provide this
}
}
public PlugInView extends View{
@Inject
private PlugInView(PlugInController controller){
//Do stuff with controller
}
}
答案 0 :(得分:0)
好吧,我终于找到了为什么我的方法不起作用。在阅读之后,为了让guice注入依赖关系,guice必须是实例化你的类的人。在我的方法中,我有一个迭代器,懒惰地实例化服务加载器加载的模块。为了解决这个问题,我已经停止从我的核心应用程序安装模块。
@Override
protected void configure() {
ServiceLoader<IModule> modules = ServiceLoader.load(IModule, ucl);
bind()...//Configure core app bindings
//Removed this part
for (IModule module : modules) {
install(module);
}
//Until here
}
让每个插件都制作自己的注入器,以便调用自己的配置方法。这种方法似乎给每个模块独立的注射器,在我看来似乎是可以接受的,因为我希望每个模块都是独立的。我也喜欢这种方法如何允许我的插件不再实现Module接口或扩展AbstractModule,让他们可以自由选择是否使用guice。