2015-04-03 25 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