【问题标题】:Understanding Play 2.4 Dependency Injection理解 Play 2.4 依赖注入
【发布时间】:2015-10-08 17:16:27
【问题描述】:

我在了解如何在 Play 2.4 中应用依赖注入的新功能时遇到问题。我对 Guice 很熟悉,但在 Play Documentation 中没有解释实际绑定是如何以及何时发生的。我阅读了官方文档 [1] 并尝试使用最新的 Play Mailer [2] 作为示例。 Play Mailer 示例使用任意类并使用@inject 注释MailerClient 属性。当我尝试使用此类的对象时,属性是null,至少在调试时是这样。那么,我必须在何时何地进行实际注射?我对@singleton 注释有同样的问题。只是解释了如何注释它,而不是如何获取对象。我必须直接使用 Guice,还是集成了一些方法?

[1]https://www.playframework.com/documentation/2.4.x/JavaDependencyInjection

[2]https://github.com/playframework/play-mailer

【问题讨论】:

  • 你能告诉我们你的代码吗?
  • 它基本上就像官方的 Play Mailer 示例。我在另一个类中启动MyComponent 并调用sendMail() 方法。
  • 我也对此感到困惑,并希望看到更多的例子。我正在编写一些 S3 代码,并且我有一个 S3File 对象,该对象依赖于应该注入的 S3Service。如何创建一个注入 S3Service 的新 S3File 实例?我是否在我的控制器中创建一个注入器?在那种情况下,我想我会使用 'injector.getInstance(S3File.class)' 而不是 'new S3File'?如何创建注入器 - 必须创建 AbstractModule 的特定 impl 来为这一类进行绑定似乎有点过头了。如果不是这个,我界面上的@ImplementedBy 会做什么?

标签: java playframework dependency-injection guice playframework-2.4


【解决方案1】:

我相信,绑定是通过将​​MailerModule 添加到play.modules.enabled 来进行的。 MailerModule 为 MailerClient 提供 Guice 绑定。

play {
  modules {
    enabled += "play.api.libs.mailer.MailerModule"
  }

为了让 Guice 将 MailerClient 注入您的对象,它应该通过 Guice 创建。例如,如果您想在 Controller 中使用@Inject MailerClient 或将 Service 注入到控制器中,则需要通过 Guice 注入您的控制器。 Recommended approach for this in Play 2.4 正在将以下内容添加到您的 build.sbt:

routesGenerator := InjectedRoutesGenerator

【讨论】:

  • 是的,完全正确。和我想的一样。它必须通过 Guice 注入。我了解InjectedRoutesGenerator 是如何做到这一点的,因为你有一些实例,它正在执行注入。但是在 Play Mailer 的文档中,这不是在控制器中完成的,而是在随机类中完成的。那么谁来负责呢?
  • @linsenfips 如果应该注入字段 MailerClient,则必须通过 Guice 创建这个“随机类”对象。或者,如果您想完全跳过 DI,可以使用 Constructor/Setter 手动设置字段。
  • 谢谢!那正是我所想。但仍然:我该怎么做。 Play 开发人员将 Guice 紧密集成到框架中。那么通过Guice创建对象的“官方玩法”是什么?
  • @linsenfips 您可以创建一个自定义 Guice 模块来提供您的绑定。 Play 允许您使用 play.modules.enabled 添加自定义 Guice 模块。请参阅documentation 中的示例。现在你在 Guice 领域,有几种方法可以将你的自定义实例提供给注入器;其中一个选项是在您的 Guice 模块(使用任何名称)中创建一个方法以返回 MailerClient 并使用 @Provides 对其进行注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多