2014-09-23 46 views
2

我想要一个现有的bean注入到Groovy类,我知道Grails的豆注入不正常的Groovy类工作(在SRC /常规文件夹)的最佳途径。我可以通过Grails的 - 以访问bean在普通的Groovy类

Holders.applicationContext.getBean('beanName') 

可以访问一个bean不过,我想如果这是最好的方法(从执行速度和观点内存使用点)。我将调用来自那是正常使用的应用程序中调用数百次法豆,我想知道是否有可能是一个更好的办法。最起码,我应该存储的bean引用(可能是在构造函数中),所以我不一遍又一遍拨打上面的代码?我可以存储对bean的静态引用,以便每个类不必存储它自己的?任何其他建议或改进?在SRC /常规

回答

1

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

通过添加豆类resources.groovy你也可以注入这些豆成服务和控制器。

欲了解更多详情,请参阅该Spring section in the Grails documentation

+0

我会澄清我原来的问题,但它实际上是做与你提到的相反。我试图将一个现有的bean注入到一个正常的Groovy类中。不要将普通的Groovy类注入到服务或控制器中。谢谢。 – 2014-09-23 15:39:12

+0

它可以在两个方向上工作。通过在resources.groovy中添加一个bean,你可以告诉spring这个bean。所以spring可以将其他bean注入到这个bean中,并且这个bean可以注入到其他bean中。 – micha 2014-09-23 15:41:28

+0

这并没有帮助,这是一个圆形的解决方案。现在他的类可以访问其他bean,因为它是一个bean,但他如何访问他的类的bean? – 2014-09-23 23:21:13

2

你的Groovy(或Java)类不能使用依赖注入,但它极有可能直接或间接地从一个类可以,例如,被称为控制器或服务。而不是在其依赖本类上拉(其中相当强烈反对依赖注入和控制反转的思想运行),传递到类,它需要,或者至少在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) 

    } 
}