我正在尝试将现有bean注入到Groovy类中,我知道Grails bean注入不适用于普通的Groovy类(在src / groovy文件夹中)。我可以通过
访问beanHolders.applicationContext.getBean('beanName')
但是,我想知道这是否是最好的方法(从执行速度和内存使用的角度来看)。我将从正常使用应用程序期间被调用数百次的方法调用bean,我想知道是否有更好的方法。至少,我应该存储bean引用(可能在构造函数中),以便我不会一遍又一遍地调用上面的代码?我可以存储一个bean的静态引用,以便每个类不必存储自己的?还有其他建议或改进吗?
答案 0 :(得分:2)
您的Groovy(或Java)类不能使用依赖注入,但很可能直接或间接地从类中调用,例如,控制器或服务。而不是让这个类拉入它的依赖(它依赖于依赖注入和控制反转的思想运行),将类所需的bean传递给类,或者如果bean不是,则至少传递ApplicationContext
。总是在前面知道。
例如,而不是在您的服务中执行此操作(其中Thing
是您的src / groovy类):
def someServiceMethod(...) {
def thing = new Thing()
thing.doSomething(42, true)
}
为服务中所需的bean添加依赖注入,并将其与其他args一起传递,无论是在构造函数中还是在单个方法中,例如。
class MyService {
def someBean
def someServiceMethod(...) {
def thing = new Thing(someBean)
thing.doSomething(42, true)
}
}
答案 1 :(得分:1)
默认情况下,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'
}
通过向resources.groovy添加bean,您还可以将这些bean注入服务和控制器。