Guice重写NamedCache绑定

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Guice重写NamedCache绑定相关的知识,希望对你有一定的参考价值。

我正在使用Play 2.6和Play缓存抽象。

我在应用程序中配置了2个缓存,名称为“x”和“y”。

在测试期间,我想用我的假缓存实现覆盖每个缓存。

缓存用@NamedCache("X") val cache: AsyncCacheApi@NamedCache("Y") val cache: AsyncCacheApi注释,但我似乎无法在模块中覆盖它们:

    class FakeCacheModule extends AbstractModule {
      override def configure(): Unit = {
        bind(classOf[AsyncCacheApi]).annotatedWith(Names.named("X")).toInstance(new FakeCache)
        bind(classOf[AsyncCacheApi]).toInstance(new FakeCache)
        bind(classOf[AsyncCacheApi]).annotatedWith(Names.named("Y")).toInstance(new FakeCache)
      }
    }

这些绑定都不起作用。

答案

Names.named("")返回com.google.inject.name.Named的实例,但缓存绑定用play.cache.NamedCache注释。

Names.named()的实施是:

public static Named named(String name) {
    return new NamedImpl(name);
}

并且你可以通过使用NamedCache的实例来获得NamedCacheImpl注释的工作绑定,它实现了NamedCache。因此,一个有效的解决方案

class FakeCacheModule extends AbstractModule {
    override def configure(): Unit = {
        bind(classOf[AsyncCacheApi]).annotatedWith(new NamedCacheImpl("X")).toInstance(new FakeCache)
        bind(classOf[AsyncCacheApi]).toInstance(new FakeCache)
        bind(classOf[AsyncCacheApi]).annotatedWith(new NamedCacheImpl("Y")).toInstance(new FakeCache)
  }
}

以上是关于Guice重写NamedCache绑定的主要内容,如果未能解决你的问题,请参考以下文章

OptionalBinding 使用 Guice 避免用户绑定

Guice 注入空指针

子模块的故障安全注入器。 google guice 中的可选绑定

Apache Druid源码导读--Google guice DI框架

Apache Druid源码导读--Google guice DI框架

namedCache 到 Localcahce infinispan-config-12.1.xsd