3

我正在尝试将现有 bean 注入 Groovy 类,并且我知道 Grails bean 注入不适用于普通的 Groovy 类(在 src/groovy 文件夹中)。我可以通过

Holders.applicationContext.getBean('beanName')

但是,我想知道这是否是最好的方法(从执行速度和内存使用的角度来看)。我将从在应用程序的正常使用期间调用数百次的方法中调用 bean,我想知道是否有更好的方法。至少,我是否应该存储 bean 引用(可能在构造函数中),这样我就不会一遍又一遍地调用上面的代码?我可以存储对 bean 的静态引用,以便每个类都不必存储自己的吗?还有其他建议或改进吗?

4

2 回答 2

2

您的 Groovy(或 Java)类不能使用依赖注入,但很可能直接或间接地从可以使用的类(例如控制器或服务)调用。与其让这个类引入它的依赖关系(这与依赖注入和控制反转的想法相悖),不如将它需要的 bean 传递给类,或者至少ApplicationContext如果 bean 并不总是已知的正面。

因此,例如,而不是在您的服务中执行此操作(Thing您的 src/groovy 类在哪里):

def someServiceMethod(...) {

   def thing = new Thing()
   thing.doSomething(42, true)

}

在服务中为它需要的 bean 添加依赖注入,并将其与其他参数一起传递,无论是在构造函数中还是在单个方法中,例如

class MyService {

   def someBean

   def someServiceMethod(...) {

      def thing = new Thing(someBean)
      thing.doSomething(42, true)

   }
}
于 2014-09-23T23:27:52.743 回答
1

默认情况下,不会选择 src/groovy 中的 Groovy 类进行依赖注入。但是您可以通过向以下位置添加 bean 定义来手动配置它们conf/spring/resources.groovy

import your.class.from.src.groovy.MyBean
beans = {
    myBean(MyBean)
}

使用这种方式,您可以配置应如何解决依赖关系。你可以做这个手册,例如

myBean(MyBean) {
  myService = ref('myService') // assumes you have a MyService bean that can be injected to the `myService` field
}

或者您可以使用自动装配(默认情况下 grails 对服务/控制器执行的操作):

myBean(MyBean) { bean ->
  bean.autowire = 'byName'
}

通过将 bean 添加到 resources.groovy,您还可以将这些 bean 注入到服务和控制器中。

有关更多详细信息,请参阅Grails 文档中的 Spring 部分

于 2014-09-23T15:34:47.403 回答