所以我试图将PlayFramework应用程序从版本2.4.3迁移到2.5.6。我正在使用Squeryl和akka-quartz-scheduler,Squeryl需要手动设置会话,而akka-quartz-scheduler作为自己的实体运行,因为其他模块都没有真正依赖它,尽管它依赖于它在别人身上。所以以前有一个Global
- 对象在启动时处理它们:
import org.squeryl.{Session, SessionFactory}
object Global extends GlobalSettings {
private lazy val injector = Guice.createInjector(CustomModule)
override def onStart(app: Application) {
SessionFactory.concreteFactory = // Squeryl initialization http://squeryl.org/sessions-and-tx.html
injector.getInstance(classOf[CustomScheduler]).initialize()
}
}
之前已经奏效了。但是,在2.5.6我试图完全偏离Global.scala
。我不确定这是否是最好的方法,但从documentation来看似乎就是这样。所以我正在尝试创建Singleton类,并在应用程序加载之前急切地加载它们,如指示here作为onStart
的替代。就像eager bindings -page上的指示一样,我有:
import com.google.inject._
class CustomModule extends AbstractModule {
override def configure() = { // or without override
println("configure called")
bind(classOf[SquerylInitialization]).to(classOf[SquerylInitialization]).asEagerSingleton()
bind(classOf[CustomScheduler]).to(classOf[CustomScheduler]).asEagerSingleton()
}
}
import play.api.{Configuration, Application}
import play.api.db.{DB, DBApi}
import org.squeryl.{SessionFactory, Session}
@Singleton
class SquerylInitialization @Inject()(conf: Configuration, dbApi: DBApi) extends Logging {
SessionFactory.concreteFactory = // Squeryl initialization http://squeryl.org/sessions-and-tx.html
}
import akka.actor.{ActorSystem, ActorRef}
@Singleton
class CustomScheduler @Inject()(system: ActorSystem) extends Logging {
val scheduler: QuartzSchedulerExtension = QuartzSchedulerExtension(system)
// other initialize code here
}
永远不会调用继承CustomModule
及其AbstractModule
- 方法的configure()
。在Guice documentation中说“或者,play将扫描实现AbstractModule的类的类路径”。文档可能不是最新的,但这似乎是它的工作方式。
例如,如果在使用Squeryl的所有类上使用依赖注入来加载SquerylInitialization
它可以工作,但是我不确定这是否是好方法,因为它需要大量的类,并且几乎没有任何类别取决于CustomScheduler
。
基本上问题是:
为什么CustomModule
调用configure()
- 方法并不热切
加载类,以及如何修复它?
这是加载此类功能的标准方式,还是应该采用其他方式?
答案 0 :(得分:1)
所以基本上评论是正确的,文档刚刚过时,所以包括
// app 1.3.9 declarations
(function() {
angular.module('app139', [])
.run(function($rootScope, $window) {
$rootScope.version = $window.angular.version;
});
angular.element(document).ready(function() {
var element = angular.element(document.getElementById('app139'));
angular.bootstrap(element, ['app139']);
});
})();
// app 1.5.7 declarations
(function(angular) {
angular.module('app157', [])
.config(function($provide) {
$provide.decorator('$window', function $windowDecorator($delegate) {
return new Proxy($delegate, {
get: function(target, prop) {
return prop == 'angular' ?
window.angular1_5_7 :
target[prop]
}
});
});
})
.run(function($rootScope, $window) {
$rootScope.version = $window.angular.version;
});
angular.element(document).ready(function() {
var element = angular.element(document.getElementById('app157'));
angular.bootstrap(element, ['app157']);
});
})(window.angular1_5_7);
帮助。以为我也试过了,但事实证明我并没有。回答一个评论,所以不能接受。