首页  

scala Play框架 依赖注入 guice 使用说明     所属分类 play 浏览量 290
DI Dependency Injection
@Inject 在字段或构造函数上  建议在构造函数上
import javax.inject._

class MyComponent @Inject() (component1: Component1) {
   // ...
}
@Inject 类名之后,构造函数参数之前,且带括号

控制器(Controller)加载
通过routes ,加载控制器,并与URL关联

路由定义 conf/routes
GET    /                 controllers.HomeController.hello
GET    /hello            controllers.HomeController.hello

@Singleton  单例

实现绑定到接口
import com.google.inject.ImplementedBy

@ImplementedBy(classOf[EnglishHello])
trait Hello {
  def sayHello(name: String): String
}

class EnglishHello extends Hello {
  def sayHello(name: String) = "Hello " + name
}

一个特质多个实现  @Named

import com.google.inject.AbstractModule
import com.google.inject.name.Names

class Module extends AbstractModule {
  override def configure() = {
    bind(classOf[Hello])
      .annotatedWith(Names.named("en"))
      .to(classOf[EnglishHello])

    bind(classOf[Hello])
      .annotatedWith(Names.named("de"))
      .to(classOf[GermanHello])
  }
}

Module.scala  工程根目录  Play 自动加载并注册
启动时 初始化
其他名字或其他包  application.conf 配置
play.modules.enabled += "modules.HelloModule"

禁用模块的自动注册
play.modules.disabled += "Module"

注入时 指定 name 
class MyComponent @Inject() (@Name("en") hello: Hello) {
  // ...
}


配置绑定
通过配置 实现具体的绑定
Configuration和ClassLoader

import com.google.inject.AbstractModule
import com.google.inject.name.Names
import play.api.Configuration
import play.api.Environment

class Module(environment: Environment, configuration: Configuration) extends AbstractModule {
  override def configure() = {
    // 配置文件中的配置项格式如下:
    // hello.en = "myapp.EnglishHello"
    // hello.de = "myapp.GermanHello"
    val helloConfiguration: Configuration =
      configuration.getOptional[Configuration]("hello").getOrElse(Configuration.empty)
    val languages: Set[String] = helloConfiguration.subKeys

    for (l <- languages) {
      val bindingClassName: String = helloConfiguration.get[String](l)
      val bindingClass: Class[_ <: Hello] =
        environment.classLoader
          .loadClass(bindingClassName)
          .asSubclass(classOf[Hello])
      bind(classOf[Hello])
        .annotatedWith(Names.named(l))
        .to(bindingClass)
    }
  }
}


play REST hello 实例 sbt 创建运行 Scala play 项目

上一篇     下一篇
sbt 创建运行 Scala play 项目

scala Option Try Either

scala try future 例子

sbt自定义任务

scala shell 使用第三方jar包

sbt hello 例子