当前位置: 首页 > 知识库问答 >
问题:

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

彭鸿哲
2023-03-14

我的核心应用程序完成了。我能够成功地加载模块,但我仍然不能正确地使用guice在我的模块中注入依赖项。我的核心应用程序使用service loader生成模块,并使用Guice的AbstractModule的install方法安装它们。下面是一个示例代码:(简化)

 @Override
protected void configure() {
    ServiceLoader<IModule> modules = ServiceLoader.load(IModule, ucl);
    for (IModule module : modules) {
        install(module);
    }

} 

每个模块都实现了IModule接口,扩展了Guice的module接口。让我困惑的是,当不建议到处都有注入器时,我如何提供插入实例(例如view的实例)。我读过关于@Provides注释的文章,我认为这是一个可能的解决方案,但我面临的另一个问题是,它们中的一些有依赖关系,需要注入。例如,我的pluginview注入了一个plug in Controller的实例。在这种情况下,我不确定如何使用provider接口。建议将得到真正的赞赏

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

彭衡
2023-03-14

我终于知道为什么我的方法行不通了。仔细阅读之后,似乎要让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
} 

并让每个插件创建它们自己的注入器,以便调用它们自己的配置方法。这种方法似乎为每个模块提供了独立的注入器,在我看来这是可以接受的,因为我希望每个模块都是独立的。我还喜欢这种方法允许我的插件不再实现模块接口或扩展AbstractModule,从而使它们可以自由选择是否使用guice。

 类似资料:
  • 我有一个单例类定义为: 我有另一个类使用这个单例类,但这个类必须使用新操作符创建。因此,我不能使用构造函数注入或setter注入等。 我当然可以将此实例传递到MyClass的构造函数中,但从我的程序上下文来看,这不是一个很好的设计。 另一个解决方案是为MySingletonClass创建一个静态getInstance方法,这样我就可以从程序中的任何地方获取实例。但我想知道Guice是否支持类似的东

  • 问题内容: 我正在阅读Guice文档,并且遇到了一个标题为“ 消除周期”(推荐)的部分,这引起了我的极大兴趣,因为正是这个问题才导致我今天使用该文档。 基本上,要消除循环依赖性,您可以“将依赖性案例提取到单独的类中”。 好的,那里没有新内容。 因此,在示例中,我们有。 您有一个和一个,每个都需要引用的一个实例。这个概念没有问题,并且可以通过经典的依赖注入轻松实现: 这很容易,但是现在,我需要通过G

  • 我试图了解DI在我们的代码库(Kotlin)中是如何使用的。我们正在使用googleguice进行依赖注入。 下面是一个示例类: 在模块类中: DepB类别: 据我所知,对于用< code>@Inject注释的变量,Google Guice会使用模块类来解决这些依赖关系。所以< code>DepA对象的注入方式是有意义的。 但是呢?我们如何能够在不指定任何位置的情况下注入DepB?

  • 我正在使用Guice来连接Jetty服务器,我想用Apache Shiro添加一些安全性。 似乎Shiro需要一个ServletContext来配置,但问题是我没有;在配置时没有ServletContext(例如在ServletModule中作为留档状态)。ServletContext在GuiceServletContextListener中可用,但此时,我的注入器已经创建,因此安装Shiro模块

  • 这是我的归属感。Yaml 为了检查,我使用curl如下所示: 我希望响应包含access-control-allow-*

  • 本文向大家介绍如何在不使用HTML的情况下创建网站?,包括了如何在不使用HTML的情况下创建网站?的使用技巧和注意事项,需要的朋友参考一下 如果您不了解HTML或CSS,并且想创建一个网站,那么不用担心,您可以轻松创建网站,而无需编写一行HTML代码。 以下是一些无需编写任何HTML或代码行即可构建网站的方法: 网站构造函数 当您购买网站托管计划时,托管公司将为您提供免费的网站构建器选项,以轻松创