使用Serviceloader的Guice在不使用注入器的情况下为插件创建类实例

时间:2014-02-02 04:30:08

标签: java guice serviceloader

我的核心申请已经完成。我能够成功加载模块,但我仍然无法正确使用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
   }
}

1 个答案:

答案 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。