如何在 Grails 服务上调用初始化函数?

Posted

技术标签:

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

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

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

【问题讨论】:

你的意思是一个实际的服务类? 【参考方案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
    


【讨论】:

这是一个链接 - intelligrape.com/blog/2012/08/27/… 更新链接:tothenew.com/blog/… 像魅力一样工作,这应该是公认的答案【参考方案3】:

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

public class AbcService implements InitializingBean 

    public void afterPropertiesSet() throws Exception 

    //initialization logic goes here
     

       

【讨论】:

GORM 将不可用 InitializingBean..如果要使用 Gorm,请将初始化逻辑放入 Bootstrap.groovy.. 我需要处理注入到 bean 上的数据,没有外部服务,所以我更喜欢将初始化逻辑和“调用”放在同一个对象中,而不是在引导程序中调用它

以上是关于如何在 Grails 服务上调用初始化函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何从grails中的控制器调用服务

如何在 Grails 中动态选择服务

热实现 grails 服务器端触发对话框,或如何在 AJAX 调用后突破更新区域

我在哪里可以在 grails 服务器角度客户端上添加代码

如何在 grails 应用程序中使用 API

如何在 Grails 和 AngularJS 上使用 Spring Security 进行 Ajax 登录