2012-05-21 35 views
9

我有幾個服務實現一個通用接口,我希望能夠選擇其中的一個在我的應用程序啓動時注入其他服務。如何在Grails應用程序中選擇服務實現?

我試圖引用從resources.groovy服務實現,如下圖所示但隨後春天使所選服務的新實例,並且不自動裝配它的依賴。

我該如何獲得此解決方案?還是有另一種方式?

class MyService { 

    Repository repository 

    interface Repository { 
     void save(...) 
    } 
} 

class MySqlRepositoryService implements MyService.Repository { ... } 

class FileRepositoryService implements MyService.Repository { ... } 

resources.groovy:

beans = { 
    ... 
    repository(FileRepositoryService) { } 
} 

回答

3

這當然就可以檢索從手工製造的工廠維修參考,但在我看來,你所採取的方式是最好的。我自己使用它,因爲它在一個地方收集應用程序配置階段的所有信息,因此更容易追蹤哪些實現被使用。

與自動裝配的陷阱,你所遇到可以很容易地解釋。所有放在grails-app/services中的類都由Grails自動配置爲具有自動裝配名稱的Spring單例bean。因此,您在grails-app/conf/resources.groovy中放置的bean定義會創建另一個bean,但沒有Grails約定強加的默認值。

最簡單的解決辦法是把實施src/groovy避免豆類的重複,並使用以下語法打開時自動連接:

beans = { 
    repository(FileRepositoryService) { bean -> 
    bean.autowire = 'byName' 
    } 
} 
+0

所以基本上我的倉庫將是正常的Spring bean,而不是Grails服務。這將很好地工作。謝謝! –

相關問題