更改grails中注入的服务的名称

时间:2012-02-09 18:59:05

标签: grails service

似乎无法找到关于此的信息,如果您有一些,请指向正确的主题/帖子/链接!

我有一个服务,让我们说它叫做'SomeServiceWithAReallyLongNameICannotChange'。当然,使用服务的正常方法是允许grails使用typless或typed表示法注入它们:

class SomeClass{
    //...
    def someServiceWithAReallyLongNameICannotChange
    //...
}

- 或 -

class SomeClass{
    //...
    SomeServiceWithAReallyLongNameICannotChange someServiceWithAReallyLongNameICannotChange
    //...
}

我想要做的是将服务重命名为更短的内容,但仅限于我正在使用它的地方,因为我无法更改实际服务的名称。我尝试使用'as'表示法,就像使用import一样,我尝试更改类型声明中的名称,但这些东西似乎都不起作用。这可能吗?

我试过这样的事情:

class SomeClass{
    //...
    def someServiceWithAReallyLongNameICannotChange as SS
    //and I tried
    def SomeServiceWithAReallyLongNameICannotChange SS
    //no joy
    //...
}

感谢您的帮助!

4 个答案:

答案 0 :(得分:6)

解决方案是按类型使用autowire。默认情况下,grails按名称使用autowire,因此您必须使用与bean相同的名称声明该服务。

这是示例

class FooController {

  boolean byName = false  //set autowire by type
  SomeReallyLongService service

}
  1. 您必须通过名称定义布尔变量并将其设置为false
  2. 您无法使用def,但在声明服务时必须使用实际的服务类型
  3. 它将为整个控制器按类型启用autowire,因此所有其他依赖项也将按类型自动装配
  4. 解释here

    更新: 甚至可以使用Autowired注释和限定符。

    示例:

    class MyController {
    
      @Autowired
      @Qualifier("myServiceWithDifferntName")
      def someService
    
    }
    

答案 1 :(得分:3)

您应该可以通过resources.groovy

创建新的bean
beans = {
    ss(SomeServiceWithAReallyLongNameICannotChange)
}

然后你可以正常注射它:

class SomeClass {
    //...
    def ss
    //...
}

答案 2 :(得分:1)

另一种选择,如果你不想在整个控制器中按类型使用autowire,也不想出于某种原因添加自定义bean,那就是在你需要服务的控制器中添加一个简单的方法,像这样:

def someServiceWithAReallyLongNameICannotChange
def getSS() { someServiceWithAReallyLongNameICannotChange }

然后,您可以使用ss.someMethod()在该控制器内的任何位置引用该服务。

但是,这仍然要求您为使用此服务的每个控制器添加一大块代码,否则您将对该服务进行不一致的命名。

(就我个人而言,我认为 doelleri 的方法是最好的,因为它允许你在不修改单个类的情况下在命名方面保持一致。)

答案 3 :(得分:0)

我尝试了它并且它在Grails 3上不适用于我,通过执行

来做到这一点
import org.springframework.beans.factory.annotation.Autowired
...
@Autowired
PaymentStrategyService paymentStrategySvc