
ã¹ã¯ãªããã¯ãã¢ããªã±ãŒã·ã§ã³ãããæè»ã«ããæãäžè¬çãªæ¹æ³ã®1ã€ã§ãããå€åºäžã«äœããä¿®æ£ããæ©èœãåããŠããŸãã ãã¡ããããã®ã¢ãããŒãã«ã¯æ¬ ç¹ããããŸã;æè»æ§ãšç®¡çæ§ã®ãã©ã³ã¹ãåžžã«èŠããŠããå¿
èŠããããŸãã ãããããã®èšäºã§ã¯ãã¹ã¯ãªããã䜿çšããããšã®é·æãšçæã«ã€ããŠãäžè¬çã«ã説æããŸããããã®ã¢ãããŒããå®è£
ããå®çšçãªæ¹æ³ãæ€èšããSpring Frameworkã§èšè¿°ãããã¢ããªã±ãŒã·ã§ã³ã«ã¹ã¯ãªãããè¿œå ããããã®äŸ¿å©ãªã€ã³ãã©ã¹ãã©ã¯ãã£ãæäŸããã©ã€ãã©ãªãŒã玹ä»ããŸãã
ããã€ãã®çŽ¹ä»çãªèšè
åã³ã³ãã€ã«ããã®åŸã®å±éãè¡ããã«ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ãå€æŽããæ©èœãè¿œå ããå Žåãã¹ã¯ãªããã¯æåã«é ã«æµ®ãã¶æ¹æ³ã®1ã€ã§ãã å€ãã®å Žåãã¹ã¯ãªããã¯æå³ãããŠããããã§ã¯ãªããçºçããããã«è¡šç€ºãããŸãã ããšãã°ãä»æ§ã«ã¯çŸåšå®å
šã«æ確ã§ã¯ãªãããžãã¯ã®äžéšããããŸãããåæã«äœåãªæ°æ¥ïŒãããŠããé·ãïŒãè²»ãããªãããã«ãæ¡åŒµãã€ã³ããäœæããŠã¹ã¯ãªããïŒã¹ã¿ãïŒãåŒã³åºãããšãã§ããŸãã ãããŠããã¡ãããèŠä»¶ãæããã«ãªããšããã®ã¹ã¯ãªããã¯æžãçŽãããŸãã
ãã®æ¹æ³ã¯æ°ãããã®ã§ã¯ãªãããã®é·æãšçæã¯ããç¥ãããŠããŸãïŒæè»æ§-å®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯ãå€æŽããŠåã€ã³ã¹ããŒã«ã®æéãç¯çŽã§ããŸãããäžæ¹ã§ãã¹ã¯ãªããã®ãã¹ãã¯ããå°é£ã§ãããããã»ãã¥ãªãã£ãããã©ãŒãã³ã¹ãªã©ã®åé¡ãçºçããå¯èœæ§ããããŸã
åŸã§èª¬æãããããã®ææ³ã¯ãã¢ããªã±ãŒã·ã§ã³ã§æ¢ã«ã¹ã¯ãªããã䜿çšããŠããéçºè
ãšãããã«ã€ããŠã®ã¿èããŠããéçºè
ã®äž¡æ¹ã«åœ¹ç«ã¡ãŸãã
å人çãªãã®ã¯ãªããã¹ã¯ãªããã ã
JSR-233ã§ã¯ãJavaã§ã®ã¹ã¯ãªããäœæãéåžžã«ç°¡åã«ãªããŸããã ãã®APIã«åºã¥ããã¹ã¯ãªãããšã³ãžã³ã¯ååã«ããããïŒNashornãJRubyãJythonãªã©ïŒãã³ãŒãã«å°ãã®ã¹ã¯ãªããããžãã¯ãè¿œå ããŠãåé¡ãããŸããã
Map<String, Object> parameters = createParametersMap(); ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine scriptEngine = manager.getEngineByName("groovy"); Object result = scriptEngine.eval(script.getScriptAsString("discount.groovy"), new SimpleBindings(parameters));
æããã«ããã®ãããªã³ãŒããã¢ããªã±ãŒã·ã§ã³å
šäœã«æ£åšããŠããå Žåãããã¯ç解ã§ããªããã®ã«å€ãããŸãã ãããŠãã¡ãããã¢ããªã±ãŒã·ã§ã³ã«è€æ°ã®ã¹ã¯ãªããåŒã³åºããããå Žåãããããæäœããããã«å¥åã®ã¯ã©ã¹ãäœæããå¿
èŠããããŸãã ããã«é²ãã§ãéåžžã®åæå®ãããJavaã¡ãœããã®
evaluateGroovy()
åŒã³åºããã©ããããç¹å¥ãªã¯ã©ã¹ãäœæããããšãã§ããŸãã ãããã®ã¡ãœããã¯ãäŸã®ããã«ãŸã£ããåããŠãŒãã£ãªãã£ã³ãŒããæã¡ãŸãã
public BigDecimal applyCustomerDiscount(Customer customer, BigDecimal orderAmount) { Map<String, Object> params = new HashMap<>(); params.put("cust", customer); params.put("amount", orderAmount); return (BigDecimal)scripting.evalGroovy(getScriptSrc("discount.groovy"), params); }
ãã®ã¢ãããŒãã«ãããã¢ããªã±ãŒã·ã§ã³ã³ãŒãããã¹ã¯ãªãããåŒã³åºãéã®éææ§ã倧å¹
ã«åäžããŸããã¹ã¯ãªãããåãå
¥ãããã©ã¡ãŒã¿ãŒããã©ã¡ãŒã¿ãŒã®ã¿ã€ããè¿ããããã®ãããã«ç¢ºèªã§ããŸãã äž»ãªããšã¯ãåä»ããããã¡ãœããããã§ã¯ãªããã¹ã¯ãªããã®åŒã³åºããçŠæ¢ããããšãå¿ããã«ãã³ãŒãèšè¿°æšæºã«è¿œå ããããšã§ãïŒ
ã¹ã¯ãªããããã³ãã¢ããããŸã
ã¹ã¯ãªãããåçŽã§ãããšããäºå®ã«ãããããããå€ãã®ã¹ã¯ãªããããããããããéäžçã«äœ¿çšãããšãããã©ãŒãã³ã¹ã®åé¡ãçºçããå¯èœæ§ããããŸãã ããšãã°ãå€æ°ã®groovyãã³ãã¬ãŒãã䜿çšããŠã¬ããŒããçæããããããåæã«å®è¡ããå Žåãé
ããæ©ããããã¯ã¢ããªã±ãŒã·ã§ã³ããã©ãŒãã³ã¹ã®ããã«ããã¯ã®1ã€ã«ãªããŸãã
ãããã£ãŠãå€ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ãäœæ¥é床ããã£ãã·ã¥ãå®è¡ã®ç£èŠã1ã€ã®ã¢ããªã±ãŒã·ã§ã³ã§ã®ç°ãªãã¹ã¯ãªããèšèªã®äœ¿çšãªã©ãæ¹åããããã«ãæšæºAPIã«ããŸããŸãªã¢ããªã³ãäœæããŸãã
ããšãã°ãCUBAã§ã¯ã次ã®ãããªè¿œå æ©èœããµããŒãããããªãç¬åµçãª
ã¹ã¯ãªãããšã³ãžã³ãäœæãããŸããã
- Javaããã³Groovyã§ã¹ã¯ãªãããäœæããæ©èœ
- ã¹ã¯ãªãããåã³ã³ãã€ã«ããªãããã®ã¯ã©ã¹ãã£ãã·ã¥
- ãšã³ãžã³ãå¶åŸ¡ããJMXãã³
ãã¡ãããããã¯ãã¹ãŠããã©ãŒãã³ã¹ãšäœ¿ãããããæ¹åããŸãããäœã¬ãã«ãšã³ãžã³ã¯äœã¬ãã«ã®ãŸãŸã§ãããã¹ã¯ãªããããã¹ããèªã¿åãããã©ã¡ãŒã¿ãŒãæž¡ããã¹ã¯ãªãããå®è¡ããããã«APIãåŒã³åºãå¿
èŠããããŸãã ãããã£ãŠãéçºãããã«å¹ççã«ããã«ã¯ãåãããžã§ã¯ãã§äœããã®ã©ãããŒãå®è¡ããå¿
èŠããããŸãã
ãŸããGraalVM-ç°ãªãèšèªïŒJVMãšéJVMïŒã§ããã°ã©ã ãå®è¡ã§ã
ããããã®èšèªã®ã¢ãžã¥ãŒã«ã
Javaã¢ããªã±ãŒã·ã§ã³ã«æ¿å
¥ã§ããå®éšçãªãšã³ãžã³ã¯èšããŸã§ããããŸããã Nashornãé
ããæ©ããæŽå²ã«æ®ãããšãæã¿ã1ã€ã®ãœãŒã¹ã§ç°ãªãèšèªã®ã³ãŒãã®äžéšãæžãæ©äŒãåŸãããããšãé¡ã£ãŠããŸãã ããããããã¯ãã ã®å€¢ã§ãã
Spring FrameworkïŒæããããç³ãåºïŒ
Springã«ã¯ãJDK APIã®äžã«æ§ç¯ãããçµã¿èŸŒã¿ã®ã¹ã¯ãªããå®è¡ãµããŒãããããŸãã
org.springframework.scripting.*
ããã±ãŒãžã«ã¯ãå€ãã®äŸ¿å©ãªã¯ã©ã¹ããããŸã-ã¢ããªã±ãŒã·ã§ã³ã§ã¹ã¯ãªãããäœæããããã«äœã¬ãã«APIã䟿å©ã«äœ¿çšã§ããããã«ããããã§ãã
ããã«ãããé«ãã¬ãã«ã®ãµããŒãããã
ãŸã ã詳现ã«ã€ããŠã¯ã
ããã¥ã¡ã³ãã«èšèŒãããŠã
ãŸã ã èŠããã«ãã¹ã¯ãªããèšèªïŒGroovyãªã©ïŒã§ã¯ã©ã¹ãäœæããXMLèšè¿°ãä»ããŠBeanãšããŠå
¬éããå¿
èŠããããŸãã
<lang:groovy id="messenger" script-source="classpath:Messenger.groovy"> <lang:property name="message" value="I Can Do The Frug" /> </lang:groovy>
Beanãå
¬éããããšãIoCã䜿çšããŠãã®ã¯ã©ã¹ã«è¿œå ã§ããŸãã Springã¯ããã¡ã€ã«å
ã®ããã¹ããå€æŽãããšãã«èªåã¹ã¯ãªããæŽæ°ãæäŸããã¡ãœãããªã©ã«ã¢ã¹ãã¯ããæããããšãã§ããŸãã
è¯ãããã«èŠããŸãããããããå
¬éããã«ã¯ãå®éã®ãã¯ã©ã¹ãå®è¡ããå¿
èŠããããŸããã¹ã¯ãªããã§éåžžã®é¢æ°ãèšè¿°ããããšã¯ã§ããŸããã ãŸããã¹ã¯ãªããã¯ãã¡ã€ã«ã·ã¹ãã ã«ã®ã¿ä¿åã§ããSpringå
ã«ç»ãå¿
èŠãããããŒã¿ããŒã¹ã䜿çšã§ããŸãã ã¯ããå€ãã®äººã¯ãç¹ã«ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®èŠçŽ ã泚éã«ããå ŽåãXMLæ§æã¯æ代é
ãã§ãããšèããŠããŸãã ããã¯ãã¡ãã颚å³ä»ãã§ããããã°ãã°ãããèæ
®ããªããã°ãªããŸããã
ã¹ã¯ãªããïŒé£ãããšã¢ã€ãã¢
ãã®ãããåãœãªã¥ãŒã·ã§ã³ã«ã¯ç¬èªã®äŸ¡æ ŒããããJavaã¢ããªã±ãŒã·ã§ã³ã®ã¹ã¯ãªããã«ã€ããŠè©±ããšããã®ãã¯ãããžãŒãå°å
¥ããéã«ããã€ãã®åé¡ãçºçããå¯èœæ§ããããŸãã
- 管çæ§ã å€ãã®å Žåãã¹ã¯ãªããåŒã³åºãã¯ã¢ããªã±ãŒã·ã§ã³å
šäœã«æ£åšããŠãããã³ãŒãã®å€æŽã«ãããå¿
èŠãªã¹ã¯ãªããã®åŒã³åºãã远跡ããããšã¯éåžžã«å°é£ã§ãã
- ãã€ã€ã«ãã¢ãèŠã€ããæ©èœã ç¹å®ã®ã¹ã¯ãªããã§äœãåé¡ãçºçããå Žåããã¡ã€ã«åãŸãã¯
evaluateGroovy()
ãªã©ã®ã¡ãœããåŒã³åºãã«ããæ€çŽ¢ãé©çšããªãéãããã¹ãŠã®ãã€ã€ã«evaluateGroovy()
ãèŠã€ããããšãåé¡ã«ãªããŸãã - éææ§ ã¹ã¯ãªãããæžãããšèªäœã¯ç°¡åãªäœæ¥ã§ã¯ãªãããã®ã¹ã¯ãªãããåŒã³åºã人ã«ãšã£ãŠã¯ããã«å°é£ã§ãã å
¥åãã©ã¡ãŒã¿ãŒã®ååããã©ã¡ãŒã¿ãŒã®ããŒã¿ã®çš®é¡ãå®è¡ã®çµæãèŠããŠããå¿
èŠããããŸãã ãŸãã¯ãæ¯åã¹ã¯ãªããã®ãœãŒã¹ã³ãŒããèŠãŠãã ããã
- ãã¹ããšæŽæ°-ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®ç°å¢ã§ã¹ã¯ãªãããåžžã«ãã¹ãã§ãããšã¯éããŸããããããã«ããµãŒããŒã«ã¹ã¯ãªãããã¢ããããŒãããåŸã§ããäœãåé¡ãçºçããå Žåã¯ãã¹ãŠããã°ããããŒã«ããã¯ã§ããããã«ããå¿
èŠããããŸãã
Javaã¡ãœããã§ã¹ã¯ãªããåŒã³åºããã©ãããããšãäžèšã®åé¡ã®ã»ãšãã©ã解決ã§ããããã§ãã ãã®ãããªã¯ã©ã¹ãIoCã³ã³ãããŒã§å
¬éãããŠãŒãã£ãªãã£ã¯ã©ã¹ãã
eval(âdisc_10_cl.groovyâ)
ãåŒã³åºã代ããã«ãéåžžã®æå³ã®ããååã§ãµãŒãã¹ã®ã¡ãœãããåŒã³åºãããšãã§ããã°éåžžã«
eval(âdisc_10_cl.groovyâ)
ã§ãã ãã1ã€ã®å©ç¹ã¯ãã³ãŒããèªå·±ææžåãããããšã§ããéçºè
ã¯ãç¹å®ã®ã¢ã«ãŽãªãºã ããã¡ã€ã«åã®åŸãã«é ãããŠããããšã«ã€ããŠå°æããå¿
èŠã¯ãããŸããã
ããã«ãåã¹ã¯ãªããã1ã€ã®ã¡ãœããã®ã¿ã«é¢é£ä»ããããå ŽåãIDEã®ã䜿çšç¶æ³ã®æ€çŽ¢ãã¡ãã¥ãŒã䜿çšããŠã¢ããªã±ãŒã·ã§ã³å
ã®ãã¹ãŠã®ãã€ã€ã«ãã¢ããã°ããèŠã€ããç¹å®ã®ããžãã¹ããžãã¯ã¢ã«ãŽãªãºã ããšã®ã¹ã¯ãªããã®å Žæãç解ã§ããŸãã
ãã¹ãã¯åçŽåãããŸã-ããªãã¿ã®ãã¬ãŒã ã¯ãŒã¯ãã¢ãã¯ãªã©ã䜿çšãããéåžžã®ãã¯ã©ã¹ãã¹ãã«ãªããŸãã
äžèšã®ãã¹ãŠã¯ãèšäºã®åé ã§è¿°ã¹ãã¢ã€ãã¢ãã€ãŸãã¹ã¯ãªããã«ãã£ãŠå®è£
ãããã¡ãœããã®ãç¹å¥ãªãã¯ã©ã¹ãšéåžžã«äžèŽããŠããŸãã ããããéçºè
ããã¹ã¯ãªãããšã³ãžã³ãåŒã³åºãããã«åãã¹ãããã®ãã¹ãŠã®ãµãŒãã¹ã³ãŒããé衚瀺ã«ããŠã圌ãããã«ã€ããŠãèããªãããã«ïŒãŸããã»ãšãã©ïŒã©ãããã°ããã§ããããïŒ
ã¹ã¯ãªãããªããžããª-ã³ã³ã»ãã
ã¢ã€ãã¢ã¯éåžžã«ã·ã³ãã«ã§ãSpringãç¹ã«Spring JPAãå°ãªããšãäžåºŠã¯äœ¿çšããããšããã人ã«ã¯éŠŽæã¿ãããã¯ãã§ãã å¿
èŠãªã®ã¯ãJavaã€ã³ã¿ãŒãã§ã€ã¹ãäœæããã¡ãœãããåŒã³åºããšãã«ã¹ã¯ãªãããåŒã³åºãããšã§ãã ãšããã§ãJPAã¯åãã¢ãããŒãã䜿çšããŸããã¡ãœããåãšãã©ã¡ãŒã¿ãŒã«åºã¥ããŠCrudRepositoryã®åŒã³åºããã€ã³ã¿ãŒã»ããããããªã¯ãšã¹ããäœæãããããŒã¿ããŒã¹ãšã³ãžã³ã«ãã£ãŠå®è¡ãããŸãã
ã³ã³ã»ãããå®è£
ããã«ã¯äœãå¿
èŠã§ããïŒ
æåã«ãã€ã³ã¿ãŒãã§ã€ã¹ãèŠã€ããããšãã§ããããã«ã¯ã©ã¹ã¬ãã«ã®æ³šé-ãªããžããªãšããã«åºã¥ããŠãã³ãäœæããŸãã
ãŸããã¡ãœããã®åŒã³åºãã«å¿
èŠãªã¡ã¿ããŒã¿ãä¿åããããã«ããã®ã€ã³ã¿ãŒãã§ã€ã¹ã®ã¡ãœããã®æ³šéããããã圹ç«ã€ã§ãããã ããšãã°ãã¹ã¯ãªããããã¹ããååŸããå Žæãšäœ¿çšãããšã³ãžã³ã
䟿å©ãªè¿œå æ©èœã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ïŒããã©ã«ãïŒã§ã¡ãœããã䜿çšããæ©èœã§ãããã®ã³ãŒãã¯ãããžãã¹ã¢ããªã¹ããã¢ã«ãŽãªãºã ã®ããå®å
šãªããŒãžã§ã³ã衚瀺ããéçºè
ã
ãã®æ
å ±ã ãŸãã¯ãã¢ããªã¹ããã¹ã¯ãªãããèšè¿°ããéçºè
ãããããµãŒããŒã«ã³ããŒããã ãã§ãã å€ãã®ãªãã·ã§ã³ããããŸã:-)
ãã®ããããªã³ã©ã€ã³ã¹ãã¢ã®å ŽåããŠãŒã¶ãŒãããã¡ã€ã«ã«åºã¥ããŠå²åŒãèšç®ãããµãŒãã¹ãäœæããå¿
èŠããããšããŸãã çŸæç¹ã§ã¯ãããè¡ãæ¹æ³ã¯æ確ã§ã¯ãããŸããããããžãã¹ã¢ããªã¹ãã¯ãã¹ãŠã®ç»é²ãŠãŒã¶ãŒã10ïŒ
ã®å²åŒãåããæš©å©ãããããšãèªãã1é±é以å
ã«é¡§å®¢ããã®æ®ãã確èªããŸãã ææ¥ã®ãµãŒãã¹ãå¿
èŠã§ã-çµå±ã®ãšããã ãã®å Žåãã³ãŒãã¯ã©ã®ããã«èŠããã§ããããïŒ
@ScriptRepository public interface PricingRepository { @ScriptMethod default BigDecimal applyCustomerDiscount(Customer customer, BigDecimal orderAmount) { return orderAmount.multiply(new BigDecimal("0.9")); } }
ãããŠãã¢ã«ãŽãªãºã èªäœãå°çããããšãã°groovyã§æžãããå Žåãå²åŒã¯ãããã«ç°ãªããŸãïŒ
def age = 50 if ((Calendar.YEAR - customer.birthday.year) >= age) { return orderAmount.multiply(0.75) } else { return orderAmount.multiply(0.9) }
ãã®ãã¹ãŠã®ç®çã¯ã
getEngine
ã
eval
ãªã©ã®ãããã®ãã¹ãŠã®åŒã³åºããå°ç¡ãã«ããã®ã§ã¯ãªããã€ã³ã¿ãŒãã§ã€ã¹ã³ãŒããšã¹ã¯ãªããã³ãŒãã®ã¿ãèšè¿°ããæ©äŒãéçºè
ã«äžããããšã§ãã ã¹ã¯ãªãããæäœããããã®ã©ã€ãã©ãªã¯ããã¹ãŠã®éæ³ãå®è¡ããå¿
èŠããããŸã-ã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœããã®åŒã³åºããã€ã³ã¿ãŒã»ããããã¹ã¯ãªããããã¹ããååŸãããã©ã¡ãŒã¿ãŒå€ã眮æããç®çã®ã¹ã¯ãªãããšã³ãžã³ãååŸããã¹ã¯ãªãããå®è¡ïŒãŸãã¯ã¹ã¯ãªããããã¹ãããªãå Žåã¯ããã©ã«ãã¡ãœãããåŒã³åºãïŒããŠå€ãè¿ããŸãã çæ³çã«ã¯ããã§ã«èšè¿°ãããŠããã³ãŒãã«å ããŠãããã°ã©ã ã«ã¯æ¬¡ã®ãããªãã®ãå¿
èŠã§ãã
@Service public class CustomerServiceBean implements CustomerService { @Inject private PricingRepository pricingRepository;
課é¡ã¯èªã¿ããããç解å¯èœã§ããããããå®çŸããããã«ç¹å¥ãªã¹ãã«ã¯å¿
èŠãããŸããã
ãããã¯ãã¹ã¯ãªãããæäœããããã®å°ããªã©ã€ãã©ãªãäœæããããã®ã¢ã€ãã¢ã§ããã ããã¯Springã¢ããªã±ãŒã·ã§ã³åãã§ããããã®ãã¬ãŒã ã¯ãŒã¯ã¯ã©ã€ãã©ãªã®äœæã«äœ¿çšãããŸããã ããŸããŸãªãœãŒã¹ããã¹ã¯ãªãããããŠã³ããŒãããŠå®è¡ããããã®æ¡åŒµå¯èœãªAPIãæäŸããŸããããã«ãããã¹ã¯ãªãããšã³ãžã³ã§ã®æ¥åžžçãªäœæ¥ãé ãããŸãã
ä»çµã¿
@ScriptRepository
ã§ããŒã¯ããããã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠã
Proxy
ã¯ã©ã¹ã®
newProxyInstance
ã¡ãœããã䜿çšããŠãSpringã³ã³ããã¹ãã®åæåäžã«ãããã·ãªããžã§ã¯ããäœæãããŸãã ãããã®ãããã·ã¯ãSpringã®ã³ã³ããã¹ãã§ã·ã³ã°ã«ãã³BeanãšããŠå
¬éããããããã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ãã§ã¯ã©ã¹ãã£ãŒã«ãã宣èšãã
@Autowired
ãŸãã¯
@Inject
ã¢ãããŒã·ã§ã³ãä»ããããšãã§ããŸãã èšç»ã©ããã
ã¹ã¯ãªããã€ã³ã¿ãŒãã§ã€ã¹ã®ã¹ãã£ã³ãšåŠçã¯ãSpringãJPAããŸãã¯MongoDBã®ãªããžããªãã¢ã¯ãã£ãåãããããã«ã
@EnableSriptRepositories
ã¢ãããŒã·ã§ã³ã䜿çšããŠã¢ã¯ãã£ãåãããŸãïŒãããã
@EnableJpaRepositories
ãš
@EnableMongoRepositories
ïŒã 泚éãã©ã¡ãŒã¿ãŒãšããŠãã¹ãã£ã³ããããã±ãŒãžã®ååã§é
åãæå®ããå¿
èŠããããŸãã
@Configuration @EnableScriptRepositories(basePackages = {"com.example", "com.sample"}) public class CoreConfig {
ã¹ã¯ãªãããåŒã³åºãããã®ã¡ã¿ããŒã¿ãè¿œå ããã«ã¯ã
@ScriptMethod
ã¢ãããŒã·ã§ã³ïŒå¯Ÿå¿ããç¹æ®åããã
@GroovyScript
ããã³
@JavaScript
ããããŸãïŒã§ã¡ãœãããããŒã¯ããå¿
èŠããããŸãã ãã¡ãããã€ã³ã¿ãŒãã§ãŒã¹ã®ããã©ã«ãã®ã¡ãœããããµããŒããããŠããŸãã
ã©ã€ãã©ãªã®äžè¬çãªæ§é ãå³ã«ç€ºããŸãã éã¯éçºãå¿
èŠãªã³ã³ããŒãã³ãã匷調衚瀺ããçœã¯æ¢ã«ã©ã€ãã©ãªã«ãããŸãã Springã¢ã€ã³ã³ã¯ãSpringã³ã³ããã¹ãã§äœ¿çšå¯èœãªã³ã³ããŒãã³ããããŒã¯ããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœããïŒå®éã«ã¯ããããã·ãªããžã§ã¯ãïŒãåŒã³åºããããšãã³ãŒã«ãã³ãã©ãŒãèµ·åããŸããã³ãŒã«ãã³ãã©ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã§2ã€ã®Beanãæ€çŽ¢ããŸãããããã€ããŒã¯ãã¹ã¯ãªããããã¹ããæ€çŽ¢ãããšã°ãŒãã¥ãŒã¿ãŒã¯ãå®éã«èŠã€ãã£ãããã¹ããå®è¡ããŸãã 次ã«ããã³ãã©ãŒã¯åŒã³åºãå
ã®ã¡ãœããã«çµæãè¿ããŸãã
ãããã€ããŒããã³ãšã°ãŒãã¥ãŒ
@ScriptMethod
åã¯
@ScriptMethod
ã¢ãããŒã·ã§ã³ã§æå®ããã
@ScriptMethod
ã®å®è¡æéã«å¶éãèšå®ããããšãã§ããŸãã 以äžã«ã©ã€ãã©ãªã®äœ¿çšã³ãŒãã®ãµã³ãã«ã瀺ããŸãã
@ScriptRepository public interface PricingRepository { @ScriptMethod (providerBeanName = "resourceProvider", evaluatorBeanName = "groovyEvaluator", timeout = 100) default BigDecimal applyCustomerDiscount( @ScriptParam("cust") Customer customer, @ScriptParam("amount") BigDecimal orderAmount) { return orderAmount.multiply(new BigDecimal("0.9")); } }
@ScriptParam
ã¢ãããŒã·ã§ã³ã«æ³šç®ããŠ
@ScriptParam
ã³ã³ãã€ã©ã¯ãœãŒã¹ããå
ã®ååãæ¶å»ãããããã¹ã¯ãªããã«æž¡ããšãã«ãã©ã¡ãŒã¿ãŒåã瀺ãããã«å¿
èŠã§ãïŒãããè¡ããªãããã«ããæ¹æ³ããããŸãããããã«äŸåããªãæ¹ãè¯ãã§ãïŒã ãã©ã¡ãŒã¿ãŒåãæå®ããå¿
èŠã¯ãªããããããŸãããããã®å Žåãã¹ã¯ãªããã§ãarg0ãããarg1ãã䜿çšããå¿
èŠããããŸãããèªã¿ãããã¯ããã»ã©åäžããŸããã
ããã©ã«ãã§ã¯ãã©ã€ãã©ãªã«ã¯ããã£ã¹ã¯ãã.groovyããã³.jsãã¡ã€ã«ãèªã¿åãããã®ãããã€ããŒãšãæšæºã®JSR-233 APIã®ã©ãããŒã§ãã察å¿ãããšã°ãŒãã¥ãŒã¿ãŒããããŸãã ããŸããŸãªã¹ã¯ãªãããœãŒã¹ããã³ããŸããŸãªãšã³ãžã³çšã«ç¬èªã®Beanãäœæã§ããŸãããã®ããã«ã¯ã察å¿ããã€ã³ã¿ãŒãã§ã€ã¹
ScriptProvider
ããã³
SpringEvaluator
ãå®è£
ããå¿
èŠããããŸãã æåã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯
org.springframework.scripting.ScriptSource
ãã2çªç®ã¯
org.springframework.scripting.ScriptEvaluator
ã§ãã Spring APIã䜿çšãããŠãããããæ¢ã«ã¢ããªã±ãŒã·ã§ã³ã«å«ãŸããŠããæ¢è£œã®ã¯ã©ã¹ã䜿çšã§ããŸãã
ãããã€ããŒãšã¢ãŒãã£ã¹ãã¯ãæè»æ§ãé«ããããã«ååã§æ€çŽ¢ãããŸããã³ã³ããŒãã³ãã«åãååãä»ããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®ã©ã€ãã©ãªã®æšæºBeanã眮ãæããããšãã§ããŸãã
ãã¹ããšããŒãžã§ã³ç®¡ç
ã¹ã¯ãªããã¯é »ç¹ãã€ç°¡åã«å€æŽããããããå€æŽã«ãã£ãŠäœãç Žå£ãããªãããã«ããæ¹æ³ãå¿
èŠã§ãã ã©ã€ãã©ãªã¯JUnitãšäºææ§ãããããªããžããªã¯åäœãã¹ããŸãã¯çµ±åãã¹ãã®äžéšãšããŠéåžžã®ã¯ã©ã¹ãšããŠç°¡åã«ãã¹ãã§ããŸãã ã¢ãã¯ã©ã€ãã©ãªããµããŒããããŠããŸããã©ã€ãã©ãªã®ãã¹ãã§ã¯ãã¹ã¯ãªãããªããžããªã¡ãœããã§ã¢ãã¯ãäœæããæ¹æ³ã®äŸãèŠã€ããããšãã§ããŸãã
ããŒãžã§ã³ç®¡çãå¿
èŠãªå Žåã¯ããã¡ã€ã«ã·ã¹ãã ãããŒã¿ããŒã¹ãGitãªã©ããããŸããŸãªããŒãžã§ã³ã®ã¹ã¯ãªãããèªã¿åããããã€ããŒãäœæã§ããŸãã ãã®ãããã¡ã€ã³ãµãŒããŒã§åé¡ãçºçããå Žåã«ãã¹ã¯ãªããã®ä»¥åã®ããŒãžã§ã³ãžã®ããŒã«ããã¯ãç°¡åã«æŽçã§ããŸãã
åèš
æ瀺ãããã©ã€ãã©ãªã¯ãSpringã¢ããªã±ãŒã·ã§ã³ã®ã¹ã¯ãªãããæŽçããã®ã«åœ¹ç«ã¡ãŸãã
- éçºè
ã¯ãã¹ã¯ãªããã«å¿
èŠãªãã©ã¡ãŒã¿ãŒãšè¿ããããã®ã«é¢ããæ
å ±ãåžžã«æã£ãŠããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœããã«æå³ã®ããååãä»ããããŠããå Žåãã¹ã¯ãªããã¯äœãããŸããã
- ãããã€ããŒãšãšã°ãŒãã¥ãŒã¿ãŒã¯ãã¹ã¯ãªãããåä¿¡ããã¹ã¯ãªãããšã³ãžã³ãšå¯Ÿè©±ããããã®ã³ãŒãã1ãæã«ä¿æããã®ã«åœ¹ç«ã¡ããããã®åŒã³åºãã¯ã¢ããªã±ãŒã·ã§ã³ã³ãŒãå
šäœã«åæ£ããŸããã
- ãã¹ãŠã®ã¹ã¯ãªããåŒã³åºãã¯ã䜿çšç¶æ³ã®æ€çŽ¢ã䜿çšããŠç°¡åã«èŠã€ããããšãã§ããŸãã
Spring Bootã®èªåæ§æãåäœãã¹ããmock'iããµããŒãããŸãã APIã䜿çšããŠããã¹ã¯ãªãããã¡ãœãããšãã®ãã©ã¡ãŒã¿ãŒã«é¢ããããŒã¿ãååŸã§ããŸãã ãŸããå®è¡ã®çµæãç¹å¥ãªScriptResultãªããžã§ã¯ãã§ã©ããããããšãã§ããŸããã¹ã¯ãªããã®åŒã³åºãæã«try ... catchã䜿çšããããªãå Žåã¯ãçµæãŸãã¯äŸå€ã€ã³ã¹ã¿ã³ã¹ãååšããŸãã XMLæ§æã¯ãäœããã®çç±ã§å¿
èŠãªå Žåã«ãµããŒããããŸãã æåŸã«ãå¿
èŠã«å¿ããŠãã¹ã¯ãªããã¡ãœããã®ã¿ã€ã ã¢ãŠããæå®ã§ããŸãã
ã©ã€ãã©ãªã®ãœãŒã¹-ããã