9

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

我已经尝试从 resources.groovy 引用服务实现,如下所示,但是 Spring 创建了所选服务的新实例并且不会自动装配其依赖项。

我怎样才能让这个解决方案发挥作用?还是有其他方法?

class MyService {

    Repository repository

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

class MySqlRepositoryService implements MyService.Repository { ... }

class FileRepositoryService implements MyService.Repository { ... }

资源.groovy:

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

1 回答 1

3

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

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

最直接的解决方案是将实现放入src/groovy以避免重复bean并使用以下语法打开自动装配:

beans = {
  repository(FileRepositoryService) { bean ->
    bean.autowire = 'byName'
  }
}
于 2012-05-21T08:19:45.363 回答