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

Guice 注入缓存或非缓存实现

邓昀
2023-03-14

我有一个带有guice但没有spring的应用程序。我有:

public interface Service {
   int square(int i);
}

我有两个实现:

public class NormalService implements Service {
   @Override
   public int square(int i) {
       return i * i;
   }
}

public class CachedService implements Service {
   private final Service service;

   @Inject
   public CachedService(@Named("service") Service service) {
       this.service = service;
   }

   @Override
   public int square(int i) {
       return cache.get(i, () -> i * i);
   }
}

bind(NormalService.class).to(Service.class).named("service");
bind(CachedService.class).to(Service.class).in(Singleton.class);

我希望能够将缓存服务注入所有其他服务,并且希望在缓存服务中注入正常服务。问题是,当我想在其他类中注入服务接口时,实现是随机选择的。有没有办法解决这个问题?

共有2个答案

汪弘盛
2023-03-14

类在绑定中排列。应该是

bind(Service.class).to(NormalService.class).named("service");
bind(Service.class).to(CachedService.class).in(Singleton.class);

当然,。命名(…)不起作用,请参阅Arthur的答案以获得解决方案。

秦焱
2023-03-14

您应该使用带有< code>@Named注释的命名绑定来准确指定您想要注入哪个bean。

指定要注入的bean的名称。

@Inject @Named("DefaultService")
MyService service;

然后你也在绑定中提供名字…

@Override
protected void configure() {
    bind(MysService.class)
      .annotatedWith(Names.named("DefaultService"))
      .to(MyServiceDefaultImpl.class);
}
 类似资料:
  • 当你使用本地(在内存中)缓存时,服务器可以缓存一些信息并快速地检索它,但是其他服务器不能访问这个缓存数据,他们需要到数据库中查询同样的信息。 如果你喜欢使用分布式缓存让其他服务器访问缓存的数据,由于它有一些序列化/反序列化和网络延迟开销,则需要注意:在某些情况下,它可能会降低性能。 缓存需要处理的另一个问题:缓存失效。 There are only two hard things in Compu

  • Serenity 提供一些缓存抽象和实用功能让你更容易地使用本地缓存。 术语 本地(local) 的意思是指在本地内存中缓存项目(因此没有涉及到序列化)。 当你的应用程序在网站群(web farm) 中部署时,本地缓存可能还不够或者有时合适。我们将在 分布式缓存 章节中讨论该场景。

  • 我有一个每10分钟运行一次的cron作业,并更新内容类型和x-amz-meta。但从昨天开始,似乎在cron作业运行之后,亚马逊并没有恢复所做的更改(刷新他的缓存)。 我甚至手动进行了更改,但没有更改... 上载视频时,它有一个应用程序/x-mp4内容类型,cron作业将其更改为视频/mp4。 虽然S3的内容类型正确,但cloudfront显示的是应用程序/x-mp4(旧的内容类型)。。。。 cr

  • 我正试图从部署在wildfly 8.0.0中的应用程序中使用infinispan(6.0)。独立配置(JDK1.7)中的最终版本,但我在注入方面有一些问题。从这篇帖子开始,在谷歌上搜索,我得到了这样的结论: 在standalone.xml 而且 最后在pom中。xml 这在我的清单上产生。MF 当我使用getCache()方法时,我java.lang.NullPointerException,因为

  • Web 应用程序可能需要为成百上千甚至更多的用户同时提供服务。如果你没有采取必要的措施,在这种负载下,你的网站可能会崩溃或变得没有响应。 假设在主页显示最后 10 条新闻,并且平均每分钟有上千名用户访问此页面。你可能为每个用户通过查询数据库来显示页面视图信息: SELECT TOP 10 Title, NewsDate, Subject, Body FROM News ORDER BY NewsD

  • 和RDD相似,DStreams也允许开发者持久化流数据到内存中。在DStream上使用persist()方法可以自动地持久化DStream中的RDD到内存中。如果DStream中的数据需要计算多次,这是非常有用的。像reduceByWindow和reduceByKeyAndWindow这种窗口操作、updateStateByKey这种基于状态的操作,持久化是默认的,不需要开发者调用persist(