2011-10-07 15 views
1

我正在使用resources.groovy來聲明服務,例如使用resources.groovy來定義服務

aService(com.foo.OrganizationService)

,這樣我可以配合aService到我的控制器,而不是使用organizationService這可能在未來改變。

我注意到,OrganizationService沒有像resources.groovy中聲明的其他服務那樣得到特殊處理。例如,它不會被注入grailsApplication,並可能是一個hibernateSession等等,還有其他我還沒有打的東西......

現在,我知道我可以手動將東西連接到我的服務,但我會而不必保持...

是否有一種特殊的方式來在resources.groovy中聲明一個服務,以便像grails加載的另一個服務一樣被對待?

TIA

回答

1

您的問題的簡短答案是「否」。

在封面之下,Grails服務由一些引用特定位置並期待某些屬性的智能代碼驅動。

查看源代碼(尤其是關於ServicesGrailsPlugin.groovy)是查看這些連接方式的「魔術」的好方法。

有沒有理由不想使用真正的Grails服務來解決您的問題?如果你期望像grailsApplication這樣的東西,看起來這種用法對於Grails非常特殊,並且將成爲移植到「真正的」Grails服務的一個很好的候選者。

祝你好運!

+0

在這種情況下,我註冊了spring security的登錄監聽器類,並且您必須在resources.groovy中聲明它。我會盡量讓它成爲服務,看看會發生什麼。 – geemang

1

所以我對此已經完整了一圈。這是一個計時問題。服務尚未初始化的地方。

基本上,當您使用resources.groovy進行服務連線時,您可能會面臨使用可能會初始化其自身的服務的風險,例如afterPropertiesSet方法或使用尚未注入的grails服務(log,hibernate session,..)的靜態初始化程序。

所以...我轉向的是在BootStrap.groovy文件中創建我自己的BeanBuilder。

 BeanBuilder builder = new BeanBuilder(grailsApplication.parentContext) 
    def bb = builder.beans { 
     LoginListener(com.foo.LoginListener) { 
      springSecurityService = ref("springSecurityService") 
      userService = ref("userService") 
     } 
    } 
    bb.registerBeans(grailsApplication.mainContext) 
相關問題