2013-02-19 73 views
2

我有一個執行Groovy腳本的Spring Controlled Grovoy腳本執行器類。Spring Inject/AutoWire在運行時創建的Groovy類

類似下面

final ClassLoader parent = getClass().getClassLoader(); 
    final GroovyClassLoader loader; 

    loader = AccessController.doPrivileged(new PrivilegedAction<GroovyClassLoader>() { 
     @Override 
     public GroovyClassLoader run() { 
      return new GroovyClassLoader(parent); 
     } 
    }); 


    this.groovyClass = loader.parseClass(" def returnSomthing() { return SpringControlledBean.action('Hello World') } "); 
    final GroovyObject groovyObject = (GroovyObject) this.groovyClass.newInstance(); 
    final Object[] args = { }; 
    final Object result = groovyObject.invokeMethod("returnSomthing", args); 

是否有可能注入SpringControlledBean到腳本?通過可能是一個自動裝配,或讓Spring創建類的理解,該類將需要重新創建的腳本將改變?

如果該類是類路徑的一部分並使用java構建,但是該腳本內容在運行時已過去,那麼Autowire是可能的,因此對於Spring而言這不是靜態的。

回答

1

你需要一個AutowireCapableBeanFactory的實例,你可以通過聲明你的類爲BeanFactoryAware,然後你可以調用方法autowireBean(existingBean)

例如:

class MyBeanCreator implements BeanFactoryAware { 

    private AutowireCapableBeanFactory beanFactory; //you need to add setter as well 

    def foobar() { 
    //your existing code.... 
    final GroovyObject groovyObject = (GroovyObject) this.groovyClass.newInstance(); 

    //Wire with Spring 
    beanFactory.autowireBean(groovyObject); 

    //rest of your existing code... 
    } 

} 

參見:http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/beans/factory/config/AutowireCapableBeanFactory.html

+0

這適用於Groovy類,但對於一個普通的Groovy腳本(與高清功能),這是行不通的。 Autowired需要是一個字段或方法/構造函數。也許有修改groovy類文件生成的情況。 – Ben 2013-02-21 15:17:58

+0

是的,沒有什麼可以爲普通腳本進行連線。你可以在接線/執行之前用所有必需的東西包裝它 – 2013-02-21 15:23:46