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



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

Holders.applicationContext.getBean('beanName')

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

您的Groovy(或Java)类不能使用依赖注入,但它很可能是直接或间接从一个可以调用的类(例如控制器或服务)中调用的。与其让这个类拉入它的依赖项(这与依赖项注入和控制反转的思想背道而驰),不如将它需要的bean传递到类中,或者如果bean并不总是预先知道的话,至少传递ApplicationContext

例如,与其在服务中这样做(其中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)
   }
}
默认情况下,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'
}

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

有关更多详细信息,请参阅Grails文档

中的Spring部分

最新更新