2014-10-05 4 views
6

스프링 프레임 워크 Dynamic Languages Support을 사용하고 싶습니다.자바 동적 설정 사용하기 자바 설정에서

는 XML에서 난 그냥 lang 네임 스페이스를 사용 싶지만, 자바 구성 (즉 @Configuration 클래스) 를 사용하고 싶습니다.

나는 모든 지옥을 org.springframework.scripting.config 패키지, inc에서 초기화하여이 작업을 수행 할 수 있다고 상상할 수 있습니다. BeanPostProcessor, Handlers, ParserFactoryBean이 생성되지만, 은 실제로으로 가고 싶지 않습니다.

다른 방법이 있습니까? 없으면 Groovy 스크립트에서 재로드 가능한 빈을 작성하는 데 필요한 최소한의 구성은 무엇입니까?

답변

5

전자 메일로 직접 문의 하시겠습니까? :-)

나는 그 XML Lang 지원이 매우 마력 적이라는 것을 알았다. BeanDefinition 및 그 attributes을 기반으로하는 충분한 내용이 있습니다. 추가로 lang:property의 경우 ProxyFactoryCGLIB의 일부 후크가 있습니다.

x + y 

내가 그렇게 아니라고 이해 :

@ContextConfiguration 
@RunWith(SpringJUnit4ClassRunner.class) 
public class RefreshableScriptJavaConfigTests { 

    @Autowired 
    private Calculator calculator; 

    @Test 
    public void testGroovyRefreshableCalculator() { 
     assertEquals(5, this.calculator.add(2, 3)); 
    } 

    @Configuration 
    public static class ContextConfiguration { 

     @Value("classpath:org/springframework/integration/scripting/config/jsr223/Calculator.groovy") 
     private Resource groovyScriptResource; 

     @Bean 
     public ScriptEvaluator groovyScriptEvaluator() { 
      return new GroovyScriptEvaluator(); 
     } 

     @Bean 
     public Calculator calculator() { 
      return new Calculator(new RefreshableResourceScriptSource(this.groovyScriptResource, 1000)); 
     } 

    } 

    public static class Calculator { 

     private final ScriptSource scriptSource; 

     @Autowired 
     private ScriptEvaluator scriptEvaluator; 

     public Calculator(ScriptSource scriptSource) { 
      this.scriptSource = scriptSource; 
     } 

     public int add(int x, int y) { 
      Map<String, Object> params = new HashMap<String, Object>(); 
      params.put("x", x); 
      params.put("y", y); 
      return (int) this.scriptEvaluator.evaluate(this.scriptSource, params); 
     } 

    } 

} 

Calculator.groovy은 다음과 같습니다

은 내가이 JavaConfig에 대한 참조 Spring Integration에서 ScriptEvaluatorRefreshableResourceScriptSource에 대한 몇 가지 자바 클래스 래퍼입니다 XML 정의로 인터페이스 및 구성을 살펴볼 때 유연하지만 적어도 우리가 어디에 있는지 알 수 있도록 도와줍니다.

이 문제에 대해 JIRA 문제를 제기 해 주시면 언제든지 여기서 할 수있는 것을보실 수 있습니다. Resource@Bean 방법의 경우 @EnableScripting@ScriptSource(refreshDelay = 1000)과 같은 것입니다.

이제는 @Importlang으로 정의 된 일부 XML 코드 조각을 생각해보십시오.

건배, 아르 템

+0

고마워! 나는 전자 메일을 통해 원인을 묻지 않았다. 나는 공개적이고 찾기 쉽다는 것이 좋은 질문이라고 생각한다. 2. Boom, 방금 25 명이있다. 그렇게 나쁘지는 않다. 나는 더 나쁘다고 생각했다. 그리고 네,'@ EnableScripting'이 방법이며, 기능 요청을 추가 할 것입니다. – JBaruch

+0

https://jira.spring.io/browse/SPR-12300 럭키 넘버 :) – JBaruch

1

내가 down the same path (진행중인 작업)을거야, 그리고 봄 응용 프로그램이 준비 될 때 빈 정의를 추가하여 재충전 그루비 스크립트를 초기화하는 데 성공했다. 내 예에서는 spring-boot을 사용하고 있습니다.

다음 AddBeanDefinitionsListener 리스너 클래스와 ScriptFactoryPostProcessor 빈을 추가하는 경우, 당신은 아주 작은 노력으로 그루비 스크립트를 초기화 할 수 있습니다 ...

AddBeanDefinitionsListener.groovy

public class AddBeanDefinitionsListener 
     implements ApplicationListener<ApplicationPreparedEvent> { 

    Map<String, BeanDefinition> beanDefs 

    AddBeanDefinitionsListener(Map<String, BeanDefinition> beanDefs) { 
     this.beanDefs = beanDefs 
    } 

    @Override 
    void onApplicationEvent(ApplicationPreparedEvent event) { 
     def registry = (BeanDefinitionRegistry) event.applicationContext 
       .autowireCapableBeanFactory 
     beanDefs.each { String beanName, BeanDefinition beanDef -> 
      registry.registerBeanDefinition(beanName, beanDef) 
     } 
    } 

    /* Static Utility methods */ 

    static BeanDefinition groovyScriptFactory(String scriptLocation) { 
     def bd = BeanDefinitionBuilder.genericBeanDefinition(GroovyScriptFactory) 
       .addConstructorArgValue(scriptLocation) 
       .getBeanDefinition() 
     bd.setAttribute(ScriptFactoryPostProcessor.REFRESH_CHECK_DELAY_ATTRIBUTE, 1000) 
     bd 
    } 

} 

응용 프로그램.

@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication app = new SpringApplication(Application) app.addListeners(new AddBeanDefinitionsListener([ 'foobar0': groovyScriptFactory("file:/some/path/Foobar0Service.groovy"), 'foobar1': groovyScriptFactory("file:/some/path/Foobar1Service.groovy") ])) app.run(args) } @Bean ScriptFactoryPostProcessor scriptFactory() { new ScriptFactoryPostProcessor() } } 

끝내

(Spring 4.2's events으로 구현하면 좋을 것인가?) 답변에 대한