使用接口

时间:2015-12-09 02:24:43

标签: spring grails

更新:重复。见How to separate interface from implementation in Grails services?

我想通过它与Spring的接口配置一个bean - 我希望在依赖注入框架中可以实现。

以下是一个例子:

public interface MyInterface {
     public void callMe();
}

public class MyImpl implements MyInterface {
     public void callMe() {
          println("Calling MyImpl");
     }
}

我应该如何以可以切换实现的方式配置此bean,例如,取决于我是否在开发/生产环境中?在Grails中,我希望用以下内容填充我的grails-app / config / spring / resources.groovy:

beans = {
     myBean(MyInterface) {
          implemented by MyImpl  //sintax not supported
     }
}

所以我可以在我的代码中定义和使用这个bean,如:

def myBean
(...)
myBean.callMe()

我知道有一些Spring属性,比如factory-method和factory-bean来实现这一点,但我想知道是否有一个简单直接的界面,就像在没有样板代码的情况下在Spring / Grails中定义bean一样实例化它们。

2 个答案:

答案 0 :(得分:0)

bean类型必须是非抽象类。

beans = {
    myBean(MyImpl) {
        // ...  
    }
}

如果需要,您仍然可以根据接口类型执行DI,但bean定义需要具体类型。

答案 1 :(得分:0)

这可能与关于grails环境的知识有关,而不是spring bean。

要调用特定于环境的bean配置,您可以执行以下操作:

Environment.current 提供当前环境,因此

beans = {
     myBean(MyInterface) {
         if(Environment.current == Environment.DEVELOPMENT){
          implemented by MyImpl  
        }else{
          implemented by ProdImpl   
       }
     }
}

希望它有所帮助。