2014-10-05 22 views
6

Dynamic Languages Support Spring Framework'ü kullanmak istiyorum.Spring Dynamic Languages ​​Kullanma Java Yapılandırması Desteği

XML'de Sadece lang ad kullanmak istiyorum, ama Java yapılandırma (yani @Configuration sınıflar) sadece kullanmak istiyorum.

Tüm cehennemi org.springframework.scripting.config paketinden başlatarak yapabileceğimi hayal edebiliyorum. Tüm BeanPostProcessor s, s, Parser s ve FactoryBean s oluşturdukları, ancak ben gerçekten oraya gitmek istemiyorum.

Başka yol var mı? Hiçbiri yoksa, Groovy komut dosyasından yeniden yüklenebilen bir fasulye oluşturmak için gereken en az yapılandırma ne olacak?

cevap

5

Neden bize doğrudan e-posta ile sormuyorsunuz?

XML Lang desteğinin relly magic olduğunu görüyorum. BeanDefinition ve attributes dayanan yeterli şeyler var. Ek olarak, lang:property için ProxyFactory ve CGLIB ile bazı kancalar vardır.

x + y 

o kadar olmadığını biliyoruz:

@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 geçerli:

Ne JavaConfig için bkz Spring Integration den ScriptEvaluator ve RefreshableResourceScriptSource için bazı Java sınıfı sarıcı XML tanımından arayüzler ve yapılandırma ile göründüğü kadar esnektir, ancak en azından nerede olduğumuzu görmenize yardımcı olacaktır.

Konuyla ilgili bir JIRA sorunu bildirmekten çekinmeyin ve burada neler yapabileceğimizi göreceğiz. @EnableScripting ve @ScriptSource(refreshDelay = 1000) gibi bir şey Resource@Bean yönteminde.

Şu an için lang tanımları içeren bazı XML parçacıklarını yalnızca @Import kullanabilirsiniz.

Alkış, Artem

+0

sağol! E-posta nedeni ile ben sormadım 1. Bence kamuoyu ve bitirilebilir olmak için iyi bir Soru & Cevap, 2. Bom, sadece +25 rep var :) O kadar da kötü değil, daha kötü olacağını söylemeliyim. Ve evet, @ EnableScripting 'yoldur, bir özellik isteği ekleyeceğim. – JBaruch

+0

https://jira.spring.io/browse/SPR-12300 Şanslı sayı :) – JBaruch

1

ben down the same path (work in progress) gidiyorum ve Bahar Uygulama hazırlandığı zaman fasulye tanımları ekleyerek yeniden yüklenebilir Groovy komut dosyalarını başlatmak başarmış. Örneğimde spring-boot kullanıyorum.

aşağıdaki AddBeanDefinitionsListener dinleyici sınıf ve bir ScriptFactoryPostProcessor fasulye eklerseniz, çok az çaba ile Groovy komut ilklendirebilirsiniz ...

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 
    } 

} 

Uygulama.

@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() } } 

harika

(Spring 4.2's events ile uygulanması durumunda daha güzel olabilir mi?) Cevabınız için