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 避免用户绑定
子模块的故障安全注入器。 google guice 中的可选绑定
Apache Druid源码导读--Google guice DI框架