我正试图将一个现有的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)
}
}
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部分