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

Posted

技术标签:

【中文标题】如何在 Grails 应用程序中选择服务实现?【英文标题】:How to select a service implementation in a Grails application? 【发布时间】:2012-05-27 17:22:19 【问题描述】:

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

我已尝试从 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)  

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

所以基本上我的存储库将是普通的 Spring bean 而不是 Grails 服务。这会很好地工作。谢谢!

以上是关于如何在 Grails 应用程序中选择服务实现?的主要内容,如果未能解决你的问题,请参考以下文章

Grails 应用程序的探查器

如何在 grails 应用程序中使用 API

grails Grails 单元测试中的应用程序访问

在 grails 应用程序中在运行时修改 groovy 代码

Grails:服务 VS Groovy 类

如何在 Grails 应用程序和 Java 应用程序之间共享 Spring Security 类?