Grails - 在普通Groovy类中访问Bean的最佳方法

时间:2014-09-23 15:28:11

标签: performance grails spring-bean

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

访问bean
Holders.applicationContext.getBean('beanName')

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

2 个答案:

答案 0 :(得分:2)

您的Groovy(或Java)类不能使用依赖注入,但很可能直接或间接地从类中调用,例如,控制器或服务。而不是让这个类拉入它的依赖(它依赖于依赖注入和控制反转的思想运行),将类所需的bean传递给类,或者如果bean不是,则至少传递ApplicationContext。总是在前面知道。

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

def someServiceMethod(...) {

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

}

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

class MyService {

   def someBean

   def someServiceMethod(...) {

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

   }
}

答案 1 :(得分:1)

默认情况下,src / groovy中的Groovy类没有被选中用于依赖注入。但您可以通过向conf/spring/resources.groovy添加bean定义来手动配置它们:

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'
}

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

有关详细信息,请参阅Spring section in the Grails documentation