Grails中的全局对象

时间:2013-03-23 22:16:00

标签: java grails groovy global-variables bootstrapping

在Grails中编写一个小型Web应用程序我遇到了全局对象的问题。我有一个运行线程的类 - 带有排队的ExecutorService。

问题是在哪里创建这个类的对象,让它在Controller中可用?

我已经尝试过init(BootStrap),但是没有机会在其他任何地方获取它的实例。

一般来说 - 我需要的是整个应用程序的单个实例中的对象,可以从Model和/或Controller访问。

3 个答案:

答案 0 :(得分:3)

  

一般来说 - 我需要的是整个应用程序的单个实例中的对象,可以从Model和/或Controller访问。

实现此目标的标准方法是grails-app/conf/spring/resources.groovy

中的declare the object as a Spring bean
threadPool(java.util.concurrent.Executors) { bean ->
  bean.factoryMethod = "newCachedThreadPool"
}

然后在控制器/服务/等。你可以像使用grails服务那样注入这个bean,即

def threadPool

但在这种情况下,您可能会发现使用the executor plugin更容易,它为您定义了这样一个bean,并处理了确保后台任务可用的有效GORM会话的复杂性。

答案 1 :(得分:1)

为什么不将 Executorservice 包装在Spring Bean中,或使用类似的东西:

grailsApplication.controllerClasses.each {controller ->
controller.metaClass.executorService = { ->
      executorService
 }
}

答案 2 :(得分:0)

实际上我在检查答案之前已经找到了一些东西。

对于给定的域类(示例)和控制器(ExampleController),创建

 ExampleService

并简单地包含所有需要的东西。将行为设置为@Singleton(默认)。 然后在Controller中按如下方式注入实例:

 def exampleService