【问题标题】:Guice override NamedCache bindingGuice 覆盖 NamedCache 绑定
【发布时间】:2018-03-14 08:13:35
【问题描述】:
我正在使用 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)
}
}
这些绑定都不起作用。
【问题讨论】:
标签:
playframework
guice
ehcache
【解决方案1】:
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)
}
}