在 Play 2.4 中使用 DI 时如何进行数据库初始化?
Posted
技术标签:
【中文标题】在 Play 2.4 中使用 DI 时如何进行数据库初始化?【英文标题】:How to do database initialization when using DI in Play 2.4? 【发布时间】:2015-06-20 11:35:44 【问题描述】:Play 2.4 不鼓励使用GlobalSettings.onStart
and whole Global
object。
我正在使用 play-slick,它有 great DI sample in GitHub,但它缺少一个如何进行数据库初始化的示例。
在使用 DI 和 GlobalSettings.onStart 不可用时如何实现数据库初始化?
数据库初始化的常见情况是:如果在 DEV 模式下,添加这些行,如果 PROD 执行这些。想要的例子。
【问题讨论】:
【参考方案1】:诀窍是将初始化放在注入类的构造函数中。这是一个例子:
添加app/modules/Database.scala
:
package modules
import com.google.inject.AbstractModule
import com.google.inject.name.Names
trait Database
def create(): Unit
def drop(): Unit
class TestDatabase extends Database
initialize() // running initialization in constructor
def initialize() =
println("Setup database with test data here")
def create() = ()
def drop() = ()
class ProdDatabase extends Database
// similar to above
class DatabaseModule extends AbstractModule
def configure() =
bind(classOf[Database])
.annotatedWith(Names.named("development"))
.to(classOf[TestDatabase]).asEagerSingleton
bind(classOf[Database])
.annotatedWith(Names.named("production"))
.to(classOf[TestDatabase])
添加conf/application.conf
:
play.modules.enabled += "DatabaseModule"
这就是开始。 .asEagerSingleton
将运行构造函数代码,而无需您注入它。当您想选择注入哪一个时,您需要删除 .asEagerSingleton
并加载适当的数据库实现:
在服务/控制器中,例如:
@Inject @Named("development") 数据库数据库
【讨论】:
以上是关于在 Play 2.4 中使用 DI 时如何进行数据库初始化?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 play 2.4 中使用 CommonsMailerPlugin
在 Play 框架中注入 MongoDB 实例 [java]
Play 2.4 JPA/Hibernate EntityManager 不刷新到数据库