2014-10-05 6 views
6

से वसंत गतिशील भाषा समर्थन का उपयोग करना मैं स्प्रिंग फ्रेमवर्क के Dynamic Languages Support का उपयोग करना चाहता हूं।जावा कॉन्फ़िगरेशन

एक्सएमएल में मैं सिर्फ lang नाम स्थान का उपयोग करना चाहते हैं, लेकिन मैं जावा विन्यास (अर्थात @Configuration वर्ग) केवल उपयोग करना चाहते हैं।

मैं कल्पना कर सकता हूं कि मैं इसे org.springframework.scripting.config पैकेज, इंक से सभी नरक शुरू करके कर सकता हूं। सभी BeanPostProcessor एस, Handler एस, Parser एस और FactoryBean एस वे बनाते हैं, लेकिन मैं वास्तव में वहां नहीं जाना चाहता हूं।

क्या कोई और तरीका है? यदि कोई नहीं है, तो ग्रोवी लिपि से पुनः लोड करने योग्य बीन बनाने के लिए आवश्यक न्यूनतम कॉन्फ़िगरेशन क्या होगा?

उत्तर

5

आप हमें ईमेल द्वारा सीधे क्यों नहीं पूछते हैं? :-)

मुझे लगता है कि एक्सएमएल लैंग समर्थन जादू पर निर्भर है। पर्याप्त सामान है जो BeanDefinition और इसके attributes पर आधारित है। अतिरिक्त में ProxyFactory और CGLIBlang:property के साथ कुछ हुक हैं।

@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 से ScriptEvaluator और RefreshableResourceScriptSource के लिए कुछ जावा वर्ग आवरण है

x + y 

मैं समझता हूँ कि यह ऐसा नहीं है लचीला क्योंकि यह एक्सएमएल परिभाषा से इंटरफेस और कॉन्फ़िगरेशन के साथ दिखता है, लेकिन कम से कम यह आपको यह देखने में मदद करेगा कि हम कहां हैं।

इस मामले पर एक जेआईआरए मुद्दा उठाने के लिए स्वतंत्र महसूस करें और हम देखेंगे कि हम यहां क्या कर सकते हैं। @EnableScripting और @ScriptSource(refreshDelay = 1000)Resource@Bean विधि पर कुछ ऐसा है।

मुझे लगता है कि अब आप @Importlang परिभाषाओं के साथ कुछ एक्सएमएल स्निपेट कर सकते हैं।

चीयर्स, Artem

+0

अपने जवाब के लिए धन्यवाद, आदमी! मैंने ईमेल कारण से नहीं पूछा था। मुझे लगता है कि यह एक अच्छा क्यू एंड ए सार्वजनिक और खोजने योग्य है, 2. बूम, आपको अभी +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 के साथ लागू अच्छे हो सकता है?)

संबंधित मुद्दे