Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 如何在Grails应用程序中选择服务实现?_Spring_Grails_Groovy - Fatal编程技术网

Spring 如何在Grails应用程序中选择服务实现?

Spring 如何在Grails应用程序中选择服务实现?,spring,grails,groovy,Spring,Grails,Groovy,我有几个实现公共接口的服务,我希望能够在应用程序启动时选择其中一个注入到其他服务中 我尝试从resources.groovy引用服务实现,如下所示,但是Spring创建了所选服务的新实例,并且没有自动关联其依赖项 如何使此解决方案起作用?还是有别的办法 class MyService { Repository repository interface Repository { void save(...) } } class MySqlReposit

我有几个实现公共接口的服务,我希望能够在应用程序启动时选择其中一个注入到其他服务中

我尝试从resources.groovy引用服务实现,如下所示,但是Spring创建了所选服务的新实例,并且没有自动关联其依赖项

如何使此解决方案起作用?还是有别的办法

class MyService {

    Repository repository

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

class MySqlRepositoryService implements MyService.Repository { ... }

class FileRepositoryService implements MyService.Repository { ... }
resources.groovy:

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

当然,可以从手工建造的工厂中检索到对服务的引用,但在我看来,您所采取的方法是最好的。我自己使用它,因为它将应用程序配置阶段的所有信息收集在一个地方,所以更容易跟踪使用的实现

您遇到的自动布线陷阱可以很容易地解释。grails将放入
grails app/services
中的所有类自动配置为Spring单例bean,并按名称自动连接。因此,您在
grails app/conf/resources.groovy
中放置的bean定义创建了另一个bean,但没有grails约定强加的默认值

最简单的解决方案是将实现放在
src/groovy
中,以避免bean的重复,并使用以下语法打开自动连接:

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

因此,我的存储库本质上是普通的Springbean,而不是Grails服务。那会很好的。谢谢