【问题标题】:Grails - Best Way to Access Beans in Normal Groovy ClassesGrails - 在普通 Groovy 类中访问 Bean 的最佳方式
【发布时间】:2014-11-17 21:22:44
【问题描述】:

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

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

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

【问题讨论】:

    标签: performance grails spring-bean


    【解决方案1】:

    您的 Groovy(或 Java)类不能使用依赖注入,但很可能直接或间接从可以使用的类调用,例如控制器或服务。与其让这个类引入它的依赖项(它非常反对依赖注入和控制反转的想法),不如将它需要的bean传递给类,或者如果beans不是,至少传递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)
    
       }
    }
    

    【讨论】:

      【解决方案2】:

      默认情况下,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 注入到服务和控制器中。

      更多详情请见Spring section in the Grails documentation

      【讨论】:

      • 我会澄清我最初的问题,但实际上与您提到的相反。我正在尝试将现有的 bean 注入到普通的 Groovy 类中。不要将普通的 Groovy 类注入到服务或控制器中。谢谢。
      • 它双向工作。通过向 resources.groovy 添加一个 bean,您可以告诉 spring 这个 bean。所以spring可以将其他bean注入这个bean,这个bean也可以注入其他bean。
      • 这没有帮助,这是一个循环解决方案。现在他的类可以访问其他 bean,因为它是一个 bean,但是他如何访问他的类的 bean?
      猜你喜欢
      • 2013-06-16
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 2016-10-13
      相关资源
      最近更新 更多