【问题标题】:spring bean definition using interface使用接口定义spring bean
【发布时间】:2015-12-09 02:24:43
【问题描述】:

更新:重复。见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 的方式,无需样板代码来实例化它们.

【问题讨论】:

标签: spring grails


【解决方案1】:

bean 类型必须是非抽象类。

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

如果你愿意,你仍然可以根据接口类型进行 DI,但是 bean 定义需要一个具体的类型。

【讨论】:

    【解决方案2】:

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

    要调用环境特定的 bean 配置,您可以这样做:

    Environment.current 给出当前环境,因此

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

    希望对你有帮助。

    【讨论】:

    • 感谢您的帮助,但我真正想知道的是“由...实现”中的内容,而不是如何检查环境。
    • 我猜同样的环境。事物可以与实现者一起使用
    猜你喜欢
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多