在Grails中注入不同的服务
有没有可能让两个服务实现同一个接口,并在运行时决定为Grails中的接口注入什么服务 比如说在Grails中注入不同的服务,grails,dependency-injection,Grails,Dependency Injection,有没有可能让两个服务实现同一个接口,并在运行时决定为Grails中的接口注入什么服务 比如说 MyAService implements MyInterface { ... } MyBService implements MyInterface { ... } 其他服务只需引用MyInterface,您就可以根据配置设置或任何要注入的服务来决定了?Grails使用按名称自动注入来进行基于约定的注入,如def fooService,服务等工件在启动时自动注册。如果您在resources.gro
MyAService implements MyInterface {
...
}
MyBService implements MyInterface {
...
}
其他服务只需引用MyInterface,您就可以根据配置设置或任何要注入的服务来决定了?Grails使用按名称自动注入来进行基于约定的注入,如
def fooService
,服务等工件在启动时自动注册。如果您在resources.groovy
中配置bean及其依赖项,并且可以使用groovy代码应用逻辑,那么您将拥有更多的控制权
但我会保持简单,并在BootStrap.groovy
中进行工作。在目标类中添加一个公共字段(例如def myService
)或一个私有字段和一个setter(例如void setMyService(service){this.myService=service}
)
class BootStrap {
def myAService
def myBService
def theDestinationBean
def init = { servletContext ->
if (<some condition>) {
theDestinationBean.myService = myAService
}
else {
theDestinationBean.myService = myBService
}
}
}
类引导{
def myAService
def myBService
def theDestinationBean
def init={servletContext->
如果(){
DestinationBean.myService=myAService
}
否则{
theDestinationBean.myService=myBService
}
}
}
由于它是Groovy,您可能不需要该接口,但它不会造成伤害,并且可以给您一点编译时安全性。在我的项目中,我使用了
资源。Groovy
if(myconf == "A") {
myInterfaceService = ref('myAService')
} else {
myInterfaceService = ref('myBService')
}
但我认为这是一种不好的做法,因为myAService
和myBService
都是实例化的,即使只有一个真正被使用
我希望只有一个服务作为grails服务,不同的实现将位于src
目录中,然后:
- 使用
以正确的实现填充服务resources.groovy
- 或者让我的服务从
接口实现初始化bean
AfterPropertieSet
def grailsApplication
并手动从ApplicationContext检索Bean,例如def otherDest=grailsApplication.mainContext.getBean(“”)
。您可以定义bean名称并根据需要应用逻辑对其进行循环。Spring有一个初始化bean
接口,该接口带有一个afterPropertiesSet
方法,您可以在设置完所有DEP后使用该方法进行工作。您不能在此处使用该方法,因为您在Spring完成其任务后进行工作,但您可以创建一个类似的ar接口(或者只是调用方法的约定)并在完成后调用它。