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

如何在Grails服务上调用初始化函数?,grails,Grails,我有一个Grails服务,它是一个相当复杂的单例对象的包装器。我想在服务启动时进行一些初始化以填充单例。如果有某种init()函数可以在服务启动时自动调用,那就太好了,但我没有发现这样的东西 有没有一种干净的方法可以做到这一点?服务器可以实现InitializingBean来进行一些初始化 public class AbcService implements InitializingBean { public void afterPropertiesSet() throws Excep

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


有没有一种干净的方法可以做到这一点?

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

public class AbcService implements InitializingBean {

    public void afterPropertiesSet() throws Exception {

    //initialization logic goes here
     }

   }    
}

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

class BootStrap {

   def myService

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

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

我使用标准的构造后注释:

class MyService {    

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

}

你是说实际的服务类?我需要那些GORM方法,所以我想这是最好的方法。谢谢你的解释。是的,使用BootStrap.groovy进行初始化是有意义的。从BootStrap调用是一个很好的解决方案,它允许您控制服务初始化的顺序。也就是说,如果您不需要find grain控件,我认为@PostConstruct注释的代码更少。它在我的引导程序中不起作用:(尝试了两种方法
@PostConstruct
实现InitializingBean
在Grails2.5中使用GrailResourceLocator bean时,@PostConstruct和InitializingBean中都不可用。但是,BootStrap.init()works.GORM将不可用InitializingBean..如果要使用GORM,请将初始化逻辑放入Bootstrap.groovy..我需要处理注入bean的数据,没有外部服务,因此我更喜欢使用初始化逻辑和“调用”在同一个对象内部,而不是在bootstrapHere的链接更新链接中调用它:像魅力一样工作,这应该是公认的答案