Dav*_*ker 9 grails groovy spring
我有几个服务实现了一个通用接口,我希望能够在我的应用程序启动时选择其中一个注入其他服务.
我已尝试从resources.groovy引用服务实现,如下所示,但然后Spring生成所选服务的新实例,并且不自动装配其依赖项.
我怎样才能使这个解决方案起作用?或者还有另一种方式吗?
class MyService {
Repository repository
interface Repository {
void save(...)
}
}
class MySqlRepositoryService implements MyService.Repository { ... }
class FileRepositoryService implements MyService.Repository { ... }
Run Code Online (Sandbox Code Playgroud)
resources.groovy:
beans = {
...
repository(FileRepositoryService) { }
}
Run Code Online (Sandbox Code Playgroud)
当然可以从手工建造的工厂检索服务引用,但在我看来,您采取的方法是最好的方法。我自己使用它,因为它将应用程序配置阶段的所有信息收集到一个地方,因此更容易跟踪使用了哪个实现。
您所遇到的自动装配的陷阱可以很容易地解释。所有放入的类grails-app/services
都会由 Grails 自动配置为 Spring 单例 bean,并按名称自动装配。因此,您放入的 bean 定义grails-app/conf/resources.groovy
创建了另一个 bean,但没有 Grails 约定所强加的默认值。
最直接的解决方案是放入实现src/groovy
以避免重复 bean,并使用以下语法来打开自动装配:
beans = {
repository(FileRepositoryService) { bean ->
bean.autowire = 'byName'
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
739 次 |
最近记录: |