【问题标题】:How can I call an initialization function on a Grails service?如何在 Grails 服务上调用初始化函数?
【发布时间】:2012-04-24 03:33:18
【问题描述】:

我有一个 Grails 服务,它是一个相当复杂的单例对象的包装器。我想做一些初始化以在服务启动时填充单例。如果服务启动时会自动调用某种 init() 函数,那就太好了,但我没有发现这样的事情。

有没有干净的方法来做到这一点?

【问题讨论】:

  • 你的意思是一个实际的服务类?

标签: grails


【解决方案1】:

您可以按照@Saurabh 的描述实现InitializingBean,但它会在Grails 启动过程的早期触发,因此虽然它有效,但有些东西尚不可用,例如您不能调用GORM域类中的方法,因为这发生在 bean 初始化之后。如果InitializingBean 不够用,您可以从BootStrap.groovy 调用初始化方法,例如

class BootStrap {

   def myService

   def init = { servletContext ->
      myService.initialize()
   }
}

你可以在服务类中调用initialize 或任何你想要的方法。如果您不想在服务类中使用该代码,也可以直接在BootStrap 中进行初始化工作。

【讨论】:

  • 我需要那些 GORM 方法,所以我想这是最好的方法。
  • 感谢您的解释。是的,使用 BootStrap.groovy 进行初始化是有意义的。
  • 从 Bootstrap 调用是一个很好的解决方案,它允许您控制服务初始化的顺序。也就是说,如果您不需要找到粒度控制,我认为 @PostConstruct 注释的代码更少。
  • 它在我的引导程序上不起作用 :( 尝试了两种方式 @PostConstructimplements InitializingBean
  • 在 grails 2.5 中使用 grailsResourceLocator bean 时,它在 @PostConstruct 和 InitializingBean bean 中都不可用。但是,BootStrap.init() 有效。
【解决方案2】:

我使用标准的 PostConstruct 注解:

class MyService {    

    @PostConstruct
    def init() {
      // GORM accesible from here
    }

}

【讨论】:

【解决方案3】:

服务器可以实现 InitializingBean 来做一些初始化

public class AbcService implements InitializingBean {

    public void afterPropertiesSet() throws Exception {

    //initialization logic goes here
     }

   }    
}

【讨论】:

  • GORM 将不可用 InitializingBean..如果要使用 Gorm,请将初始化逻辑放入 Bootstrap.groovy..
  • 我需要处理注入到 bean 上的数据,没有外部服务,所以我更喜欢将初始化逻辑和“调用”放在同一个对象中,而不是在引导程序中调用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多