【问题标题】:Guice bind, toInstance not injecting at startup (eager?) and instead doing during first call (lazy?)Guice 绑定,toInstance 在启动时不注入(渴望?),而是在第一次调用时注入(懒惰?)
【发布时间】:2021-11-04 21:43:13
【问题描述】:

根据这个先前回答的问题 (link),toInstance 已经是一个热切加载的单例,但我注入了一个涉及缓存更新的表依赖项,它仅在第一次调用期间发生,而不是在服务启动时。有人可以告诉我这里缺少什么以及如何更新 guice 注入以在启动期间而不是在第一次调用期间进行缓存更新?

【问题讨论】:

  • 你为什么不用bind(Something.class).to(SomethingImplclass).asEagerSingleton()
  • 当我有一个不是这种情况的界面时,我认为你提到的内容是相关的,你能告诉我是否遗漏了什么吗?
  • 我想我误解了你的问题。你能提供一个minimal reproducible example 来证明你想要实现的目标吗? asEagerSingleton() 也可以用于混凝土绑定。例如:bind(String.class).asEagerSingleton();
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: java dependency-injection guice lazy-evaluation


【解决方案1】:

使用 PRODUCTION 阶段急切地注入单例。

Guice's wiki 说:

急切的单例可以更快地发现初始化问题,并确保最终用户获得一致、快速的体验。惰性单例可实现更快的编辑-编译-运行开发周期。使用Stage 枚举指定应使用的策略。

PRODUCTION DEVELOPMENT
.asEagerSingleton() eager eager
.in(Singleton.class) eager lazy
.in(Scopes.SINGLETON) eager lazy
@Singleton *eager lazy

* Guice 只会急切地为它知道的类型构建单例。这些是您的模块中提到的类型,以及这些类型的传递依赖关系。

因此,当您创建注入器时,您应该决定是需要开发阶段还是生产阶段。现有单例的注入与上述同时发生。

为此,请像这样创建Injector

Injector injector = Guice.createInjector(Stage.PRODUCTION, modules);

【讨论】:

  • 非常感谢您对此进行调查。我有一些我不确定是否需要 Eager 的其他绑定,您能否告诉我如何单独添加特定绑定作为 Eager 并将其余的保留为默认值?
  • 我认为问题可能是存在一连串的 guice 注射,而我从头到尾都没有这样做,所以我尝试了,但仍然遇到问题,已经问了一个单独的问题那 - link,如果你能看一下,那将是一个很大的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多