Performance Grails—在普通Groovy类中访问bean的最佳方法

Performance Grails—在普通Groovy类中访问bean的最佳方法,performance,grails,spring-bean,Performance,Grails,Spring Bean,我试图将现有bean注入Groovy类,我知道Grailsbean注入不适用于普通Groovy类(在src/Groovy文件夹中)。我可以通过 Holders.applicationContext.getBean('beanName') 但是,我想知道这是否是最好的方法(从执行速度和内存使用的角度来看)。我将从一个在应用程序正常使用期间被调用数百次的方法调用bean,我想知道是否有更好的方法。至少,我应该存储bean引用(可能在构造函数中),这样我就不会反复调用上面的代码了?我是否可以存储对b

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

Holders.applicationContext.getBean('beanName')

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

默认情况下,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默认情况下对服务/控制器所做的):

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

有关更多详细信息,请参见

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

例如,不要在您的服务中这样做(其中
Thing
是您的src/groovy类):

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

class MyService {

   def someBean

   def someServiceMethod(...) {

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

   }
}

我将澄清我最初的问题,但实际上是做与你提到的相反的事情。我正在尝试将现有bean注入普通Groovy类。不将普通Groovy类注入服务或控制器。谢谢。它双向工作。通过向resources.groovy添加一个bean,您可以向spring介绍这个bean。所以spring可以将其他bean注入到这个bean中,这个bean也可以注入到其他bean中。这没有帮助,这是一个循环解决方案。现在他的类可以访问其他bean,因为它是一个bean,但是他如何为他的类访问这个bean呢?
def someServiceMethod(...) {

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

}
class MyService {

   def someBean

   def someServiceMethod(...) {

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

   }
}