2013-02-19 3 views
2

У меня есть Spring Controlled Grovoy Script Executor, который выполняет Groovy Script.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 в сценарию? через, может быть, autwire, или получить Spring, чтобы создать понимание класса, что класс должен быть воссоздан по мере изменения сценария?

Autowire возможен, если класс был частью пути к классам и построен с помощью java, но содержимое этого скрипта прошло во время выполнения, поэтому не статично для весны.

ответ

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 класса, но для простого заводного сценария (с четкостью функций), она не работает. Autowired должен быть полем или Method/Constructor. Может быть, есть возможность изменить созданный файл класса groovy. – Ben

+0

Да, для простого сценария нет ничего. вы можете обернуть его всеми необходимыми материалами перед подключением/выполнением, например –

Смежные вопросы