【问题标题】:How to use Guice's Injector?Guice的注射器如何使用?
【发布时间】:2013-02-12 19:09:51
【问题描述】:

我正在学习 Guice,但我不清楚如何使用 Injector 实例。最好在应用程序引导时创建一次Injector 实例,并将其设为公共单例?

我们是否总是必须使用Injector#getInstance(SomeClass.class) 来获取我们放置Guice 的@Inject 注释的类?

【问题讨论】:

  • 最好不要使用Injector.getInstance()
  • @millimoose 但是还有什么其他方法可以检索 Guice 管理的类?
  • @Inject 注释的字段应该有“自动”可用的正确类。 (假设您也让 Guice 管理需要注入的类。)这个想法是让容器管理您的依赖项,使用它们的类,并且只从其中获取一个“主”类手动注入器以启动您的应用程序。您还应该考虑rereading the tutorial,这是依赖注入 101。
  • 是的,我在提问之前阅读了它,但是必须使用 Injector#getInstance(MyClass.class) 检索具有带有 @Inject 注释的字段的类。那么,如果我有多个字段用@Inject 注释的类怎么办?我需要使用Injector#getInstance(ClassName.class) 开始每一堂课。
  • 啊。不必要。仅当您需要从非 Guice 管理的类中调用一个方法时。或者,您可以改为使用 Injector.injectMembers(this) 并填充来自 Injector 的所有带有 @Inject 注释的字段,即使在非托管对象上也是如此。

标签: java guice guice-3


【解决方案1】:

您不应将注入器作为全局单例传递。你看过:https://github.com/google/guice/wiki/GettingStarted吗?注意RealBillingService 不使用注入器来获取CreditCardProcessorTransactionLog 的实例。相反,Guice 在创建实例时会为您处理所有这些。

如果您需要 Guice 创建许多相同类型的对象,请考虑使用 Provider 并注入该提供程序。

【讨论】:

  • 是的,我明白了。但是,如果我有多个像RealBillingService 这样的服务,并且每个服务都有@Inject 用于注入CreditCardProcessorTransactionLog 对象的注解,该怎么办。所以我需要为每个服务使用Injector#getInstance,比如RealBillingService。但我想在不同的地方创建这个服务,所以我有 2 个变体:在每个地方创建 Injector 对象并使用 Injector#getInstance 检索必要的服务 创建 Injector 实例一次它可以访问(全局单例)到我需要它的所有地方。
  • 或者有第三个对象,它包含你的两个服务的实例(都用@Inject注释)。然后您将使用Injector 来获取第三个对象的单个实例。
  • 实际上你很少看到injector。例如,如果您将JerseyGuice 一起使用,您可以配置您的模块,然后框架会处理其余部分。
  • 即Jersey 是否支持 Guice 开箱即用?就像:Jersey 是 Guice 管理的组件,所以我们不需要显式使用Injector 实例?
  • 或者您的意思是 JEE 容器上下文中的泽西岛? IE。 CDI (Guice) 只能在容器管理器组件中使用,例如 EJB、JAX-RS (Jersey)、JAX-WS 等,而无需显式使用 Injector#getInstance?
猜你喜欢
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 2016-07-26
  • 1970-01-01
相关资源
最近更新 更多