scala Play框架 依赖注入 guice 使用说明
所属分类 play
浏览量 776
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 例子