2014-09-23 48 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) 

    } 
}