【问题标题】:How do I read/understand @Inject()... in this Scala code?如何阅读/理解此 Scala 代码中的 @Inject()...?
【发布时间】:2016-07-23 07:12:52
【问题描述】:

this question 中,一个答案说Application 类必须这样定义:

class Application @Inject()(val messagesApi: MessagesApi) extends Controller with I18nSupport {

我将这一行理解为:

  • 命名为Application
  • 扩展Controller
  • 混合特征I18nSupport

如何阅读/理解中间的@Inject()(val ...)?为什么要这样写,这是什么意思?

【问题讨论】:

  • 看起来这是一个关于依赖注入的一般问题。当然会有所帮助:playframework.com/documentation/2.5.x/ScalaDependencyInjection
  • I18nSupport 是带有抽象 def messagesApi: MessagesApi 的特征。您需要提供实施。所以你把它定义为val messagesApi: MessagesApi@Inject 表示 - 构造函数参数将由依赖注入提供。
  • 除了@PavelOliynyk 所说的之外,this issue 解释说文档对新人不太欢迎。默认情况下,Play 在 DI 的底层使用 Guice。在上述问题中,一位评论者链接到了一些可能有帮助的优秀 Guice 文档。

标签: scala dependency-injection


【解决方案1】:

如何阅读/理解中间的@Inject()(val ...)?为什么要这样写,这是什么意思?

  • @Inject() 称为 annotation。注释允许向声明、类型或表达式添加任意元数据。可以在运行时或编译时查询此元数据。
  • (val …) 称为 primary constructor。构造函数是在创建类的实例时调用的子例程,其目的是设置对象的初始状态,以便它可以使用并满足其所有不变量。

【讨论】:

    猜你喜欢
    • 2015-08-19
    • 2021-10-16
    • 2014-02-20
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多