gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:31:35 25 4
gpt4 key购买 nike

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

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

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

class MyService {

Repository repository

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

class MySqlRepositoryService implements MyService.Repository { ... }

class FileRepositoryService implements MyService.Repository { ... }

资源.groovy:
beans = {
...
repository(FileRepositoryService) { }
}

最佳答案

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

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

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

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

关于spring - 如何在 Grails 应用程序中选择服务实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10681359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com