2015-04-03 53 views
0

我工作的應用程序有就是這個樣子引用的一個服務:重構服務注入/實例在Grails應用程序

private def widgetServ = new WidgetService() 
在另一個服務

。方法被稱爲上widgetServ這樣的:使用此創建

def aVar = widgetServ.SomeMethod() 

widgetServ SQL連接:

def sql = Sql.newInstance(... 

。這是我們所面臨的一些問題:

由於我們使用的「新」,我們根據Grails文檔,不能使用static transactional = true進行隱式事務。在試圖將Grails從1.3.7升級到2.4.4時,我們注意到由於系統無法找到jdbc驅動程序,因此在創建sql變量時拋出錯誤。 我們不想使用新的,而是注入WidgetService

問題是有沒有人遇到過這個問題,你可以發佈任何陷阱?

系統中的另一項服務有類似的問題,但由於它被用作POGO並且有140多個實例被創建爲新的,所以更糟。另外,一些控制器注入並創建新的。 我們應該用什麼方法去除服務的所有'新'創作?系統確實存在過時的引用和丟失的數據問題,這些問題可能是由於這些服務中缺少事務管理引起的。

+0

注意:我引用的第二個服務有多個構造函數。 – Thanks4Playing 2015-04-03 12:28:38

回答

1

你絕對不應該在這裏使用「新」,因爲像這樣創建的對象完全不知道Spring的上下文,所以他們不知道任何關於配置,數據源等。 問題是,你爲什麼這樣做那?有什麼理由不是你經常依賴注入嗎?它不會是很痛苦的,它只是需要改變所有

private def widgetServ = new WidgetService() 

private WidgetService widgetServ 

,也許重構這個字段名widgetService(IDE中很容易做到)

+0

感謝您的建議。我進入新的項目,發現它是這樣的。現在的工作是糾正它。一個更大的工作是我提到的另一項服務,它有多個構造函數,並且在應用程序中創建了「新」140次以上。 – Thanks4Playing 2015-04-15 12:12:32