如何在 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 注释的代码更少。 它在我的引导程序上不起作用 :( 尝试了两种方式@PostConstruct
和 implements 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 服务上调用初始化函数?的主要内容,如果未能解决你的问题,请参考以下文章