èæ¯
ã¿ãªããããã«ã¡ã¯ïŒ æãããèšå®ãšãããããã©ã®ããã«æ«ã§æ£åžžã«ãªã£ããã«ã€ããŠã®è©±ãããããšæããŸãã ç§ã¯ããªã倧èŠæš¡ã§æ¯èŒçå€ããããžã§ã¯ãã«åãçµãã§ããŸãããã®ãããžã§ã¯ãã¯åžžã«æŽæ°ããã³æ¡åŒµãããŠããŸãã æ§æã¯ãxmlãã¡ã€ã«ãJava Beanã«ãããã³ã°ããããšã§æå®ãããŸãã æè¯ã®è§£æ±ºçã§ã¯ãããŸããããå©ç¹ããããŸããããšãã°ããµãŒãã¹ãäœæãããšãã«ããã®ã»ã¯ã·ã§ã³ãæ
åœããæ§æãæã€BeanããµãŒãã¹ã«æž¡ãããšãã§ããŸãã ãã ããæ¬ ç¹ããããŸãã ãããã®æãéèŠãªç¹ã¯ãæ§æãããã¡ã€ã«ã®éåžžã®ç¶æ¿ããªãããšã§ãã ããæç¹ã§ã1ã€ã®èšå®ãå€æŽããã«ã¯ãåãããã¡ã€ã«ã«1ã€ãã€ãçŽ30ã®xmlãã¡ã€ã«ãç·šéããå¿
èŠãããããšã«æ°ä»ããŸããã ããã¯ãã以äžç¶ããããšãã§ããããã¹ãŠãæžãçŽããšãã匷ãææãäžãããŸããã
å¿
èŠæ¡ä»¶
- ç¶æ¿ãšåå®çŸ©ïŒãŸãã¯ãã©ãŒã«ããã¯ïŒã åºæ¬çãªãããã¡ã€ã«ãèšå®ããåäŒç€Ÿããç¶æ¿ããŠãå¿
èŠãªå Žæãåå®çŸ©ãŸãã¯è¿œå ã§ããããã«ããå¿
èŠããããŸã
- Java Beanã§ã®ãããã³ã°ã ç§ãããããããã®ãããã䜿çšããŠããããžã§ã¯ãå
šäœã§
mongodb.directory.host
ã®åœ¢åŒã®ããããã£ã®ãã³ããã®æ§æã®äœ¿çšãæžãçŽããããããŸããã§ããã - æ§æã«ã³ã¡ã³ããæžã蟌ãæ©èœã éèŠã§ã¯ãããŸããããå¿«é©ã§å¿«é©ã§ãã
ç§ã¯ãã®èšå®ã次ã®ããã«ããããšæããŸãïŒ
å
žåçãªGroovy DSLã¹ã¯ãªãã name = "MyTest" description = "Apache Tomcat" http { port = 80 secure = false } https { port = 443 secure = true } mappings = [ { url = "/" active = true }, { url = "/login" active = false } ]
ãããã©ã®ããã«éæããã-ã«ããã®äžã§ã
ãã¶ãããã®ããã®ã©ã€ãã©ãªã¯ãã§ã«ãããŸããïŒ
ããããããã§ãã ããããç§ãèŠã€ããŠèŠããã®ã®ãã¡ãç§ã«ãµãããããã®ã¯ãããŸããã§ããã ãããã®ã»ãšãã©ã¯ãæ§æãèªã¿åãããããã1ã€ã®å€§ããªæ§æã«çµåããŠãããåå¥ã®ãããã¿ãŒãä»ããŠåä¿¡ããæ§æãåŠçããããã«èšèšãããŠããŸãã ãã³ã«ãããããæ¹æ³ãç¥ã£ãŠãã人ã¯ã»ãšãã©ããªããããæ°ååã®ã¢ããã¿ãŒã³ã³ããŒã¿ãŒã®äœæã«ã¯æéãããããããŸãã Lightbendã®èšå®ã¯ããã®HOCON圢åŒãšç¶æ¿/åå®çŸ©ããã®ãŸãŸäœ¿çšã§ããæãææãªãã®ã®ããã§ãã ãããŠã圌女ã¯ã»ãšãã©Java Beanãåããããšããã§ããŸããããå€æããããã«ã圌女ã¯ãããããæ¹æ³ãç¥ãããéåžžã«è²§åŒ±ã«æ¡åŒµããŸãã ç§ã圌女ã§å®éšããŠããéãååã¯çµæã®æ§æãèŠãŠããããæå³ã§ã¯Groovy DSLã«äŒŒãŠããããšèšã£ãã ããã§ãããã䜿ãããšã«æ±ºããŸããã
ããã¯äœã§ãã
DSLïŒãã¡ã€ã³åºæèšèªïŒã¯ãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³åéããã®å Žåã¯ã¢ããªã±ãŒã·ã§ã³ã®æ§æã«åãããŠèª¿æŽãããèšèªã§ãã ç«ã®åã®ãã¿ãã¬ã«äŸããããŸãã
Javaã¢ããªã±ãŒã·ã§ã³ããgroovyã¹ã¯ãªãããå®è¡ããã®ã¯ç°¡åã§ãã ããšãã°ãGradleã«å¿ããŠãGroovyãè¿œå ããå¿
èŠããããŸãã
compile 'org.codehaus.groovy:groovy-all:2.3.11'
GroovyShellã䜿çšããŸã
GroovyShell shell = new GroovyShell(); Object value = shell.evaluate(pathToScript);
ã©ã®ããã«æ©èœããŸããïŒ
ãã¹ãŠã®éæ³ã¯2ã€ã®ããšã«åºã¥ããŠããŸãã
代衚å£
ãŸããgroovyã¹ã¯ãªããããã€ãã³ãŒãã«ã³ã³ãã€ã«ãããã¯ã©ã¹ãäœæãããŸããã¹ã¯ãªãããå®è¡ããããšããã¹ãŠã®ã¹ã¯ãªããã³ãŒããå«ããã®ã¯ã©ã¹ã®runïŒïŒã¡ãœãããåŒã³åºãããŸãã ã¹ã¯ãªãããå€ãè¿ãå Žåã evaluate()
çµæãšããŠååŸã§ããŸãã ååãšããŠãã¹ã¯ãªããå
ã®æ§æã§BeanãäœæããŠè¿ãããšã¯å¯èœã§ããããã®å ŽåãçŸããæ§æã¯åŸãããŸããã
代ããã«ãç¹å¥ãªã¿ã€ãã®ã¹ã¯ãªããDelegatingScriptãäœæã§ããŸãã ãã®ç¹åŸŽã¯ãããªã²ãŒããªããžã§ã¯ããæž¡ãããšãã§ãããã¹ãŠã®ã¡ãœããåŒã³åºããšãã£ãŒã«ãã®æäœãããã«å§ä»»ãããããšã§ãã ãªã³ã¯ããã¥ã¡ã³ãã«ã¯äœ¿çšäŸããããŸãã
èšå®ãå«ãã¯ã©ã¹ãäœæããŸããã
@Data public class ServerConfig extends GroovyObjectSupport { private String name; private String description; }
@Data
ãã³ãã¯ã©ã€ãã©ãªã®ã¢ãããŒã·ã§ã³ïŒãã£ãŒã«ãã«ã²ãã¿ãŒãšã»ãã¿ãŒãè¿œå ããtoStringãequalsãhashCodeãå®è£
ããŸãã 圌女ã®ãããã§ãPOJOã¯ãã³ã«å€ãããŸãã
GroovyObjectSupport
ã¯ããgroovyãªããžã§ã¯ãã®ããã«èŠãããjavaãªããžã§ã¯ããïŒããã¥ã¡ã³ãã«èšèŒãããŠããïŒã®åºæ¬ã¯ã©ã¹ã§ãã åŸã§å¿
èŠãªçç±ã瀺ããŸãã ãã®æ®µéã§ã¯ããããªãã§å®è¡ã§ããŸãããããã«å®è¡ã§ããŸãã
次ã«ããã£ãŒã«ãã«å
¥åããã¹ã¯ãªãããäœæããŸãã
name = "MyTestServer" description = "Apache Tomcat"
ããã§ã¯ãã¹ãŠãæããã§ãã ãããŸã§ã®ãšãããã芧ã®ãšãããDSLæ©èœã¯äœ¿çšããŠããŸãããåŸã§èª¬æããŸãã
ãããŠæåŸã«ãJavaããå®è¡ããŸã
CompilerConfiguration cc = new CompilerConfiguration(); cc.setScriptBaseClass(DelegatingScript.class.getName());
ServerConfig(name=MyTestServer, description=Apache Tomcat)
ã¯ãtoStringïŒïŒã®ãã³ããã¯å®è£
ã®çµæã§ãã
ã芧ã®ãšããããã¹ãŠãéåžžã«ç°¡åã§ãã configã¯å®éã®å®è¡å¯èœãªgroovyã³ãŒãã§ããããã®äžã®èšèªã®ãã¹ãŠã®æ©èœãããšãã°çœ®æã䜿çšã§ããŸã
def postfix = "server" name = "MyTest ${postfix}" description = "Apache Tomcat ${postfix}"
ServerConfig(name=MyTest server, description=Apache Tomcat server)
ãã®ã¹ã¯ãªããã§ã¯ããã¬ãŒã¯ãã€ã³ããšåæ¹ãèšå®ããããšãã§ããŸãïŒ
ã¡ãœããåŒã³åºã
ããã§ã¯ãå®éã®DSLã«ç§»ããŸãããã ã³ãã¯ã¿èšå®ãæ§æã«è¿œå ãããšããŸãã ãããã¯æ¬¡ã®ããã«ãªããŸãã
@Data public class Connector extends GroovyObjectSupport { private int port; private boolean secure; }
2ã€ã®ã³ãã¯ã¿ãhttpããã³httpsã®ãã£ãŒã«ãããµãŒããŒæ§æã«è¿œå ããŸãã
@Data public class ServerConfig extends GroovyObjectSupport { private String name; private String description; private Connector http; private Connector https; }
ãã®ã°ã«ãŒãŽã£ãŒãªã³ãŒãã䜿çšããŠãã¹ã¯ãªããããã³ãã¯ã¿ãèšå®ã§ããŸã
import org.example.Connector
å®è¡çµæServerConfig(name=MyTest, description=Apache Tomcat, http=Connector(port=80, secure=false), https=null)
ã芧ã®ãšãããããã¯æ©èœããŸãããããã¡ããããã®ãããªæ§æã¯èšå®ã«ã¯ãŸã£ããé©ããŠããŸããã èŠããããã«èšå®ãæžãçŽããŸãïŒ
name = "MyTest" description = "Apache Tomcat" http { port = 80 secure = false } https { port = 443 secure = true }
çµæã¯äŸå€ã§ããException in thread "main" groovy.lang.MissingMethodException: No signature of method: config.http() is applicable for argument types: (config$_run_closure1) values: [config$_run_closure1@780cb77]
ã
http(Closure)
ã¡ãœãããåŒã³åºãããšããŠããããã«èŠããŸãããgroovyã¯ããªã²ãŒããªããžã§ã¯ããŸãã¯ã¹ã¯ãªããå
ã§ãããèŠã€ããããšãã§ããŸããã ãã¡ãããServersConfigã¯ã©ã¹ã§å®£èšããããšãã§ããŸãã
public void http(Closure closure) { http = new Connector(); closure.setDelegate(http); closure.setResolveStrategy(Closure.DELEGATE_FIRST); closure.call(); }
httpsã«ã€ããŠãåæ§ã§ãã ä»åã¯ãã¹ãŠãè¯ãã§ãïŒ
å®è¡çµæServerConfig(name=MyTest, description=Apache Tomcat, http=Connector(port=80, secure=false), https=Connector(port=443, secure=true))
ããã§ã¯ããããDSLãžã®æåã®ã¹ãããã§ãããããäœããããã説æããå¿
èŠããããŸãã groovy.lang.Closure
ãã©ã¡ãŒã¿ãŒgroovy.lang.Closure
åãåãã groovy.lang.Closure
ãã£ãŒã«ãã®æ°ãããªããžã§ã¯ããäœæããçµæã®ã¯ããŒãžã£ãŒã«å§ä»»ããã¯ããŒãžã£ãŒã³ãŒããå®è¡ããã¡ãœããã宣èšããŸããã ã²ã
closure.setResolveStrategy(Closure.DELEGATE_FIRST);
ã€ãŸãããã£ãŒã«ããŸãã¯ã¡ãœãããåç
§ããå Žåãgroovyã¯æåã«ããªã²ãŒãã調ã¹ã次ã«é©åãªãã®ãèŠã€ãããªãå Žåã«ã®ã¿ã¯ããŒãžã£ãŒã調ã¹ãŸãã ã¹ã¯ãªããã®å Žåããã®æŠç¥ã¯ããã©ã«ãã§äœ¿çšãããŸã;ã¹ã¯ãªãããéããã«ã¯ãæåã§ã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
ãã¿ãã¬èŠåºãgroovyãä»ããŠæ§æå¯èœãªãã°ããã¯ã©ã€ãã©ãªã¯ããã®ã¢ãããŒãã®ã¿ã䜿çšããŸãã DSLã§äœ¿çšããããã¹ãŠã®ã¡ãœãããæ瀺çã«å®è£
ããŸããã
ååãšããŠããã§ã«ç¹å®ã®DSLããããŸãããçæ³ããã¯ã»ã©é ãã§ãã æåã«ãåãã£ãŒã«ããèšå®ããã³ãŒããæåã§èšè¿°ããªãããã«ããŸãã次ã«ãæ§æã§äœ¿çšããããã¹ãŠã®ã¯ã©ã¹ã®Beanã®ã³ãŒãã®éè€ãé¿ããŸãã ãããŠãããã§ã°ã«ãŒãŽã£ãŒãªDSLããžãã¯ã®2çªç®ã®ã³ã³ããŒãã³ããå©ãã«ãªããŸã...
methodMissingïŒïŒ
groovyã¯ããªããžã§ã¯ãã«ãªãã¡ãœããåŒã³åºãã«ééãããã³ã«ãmethodMissingïŒïŒã®åŒã³åºããè©Šã¿ãŸãã ãã©ã¡ãŒã¿ãšããŠãåŒã³åºãããšããã¡ãœããã®ååãšåŒæ°ã®ãªã¹ããããã«æž¡ãããŸãã ServerConfigã¯ã©ã¹ããhttpããã³httpsã¡ãœãããåé€ãã代ããã«æ¬¡ã宣èšããŸãã
public void methodMissing(String name, Object args) { System.out.println(name + " was called with " + args.toString()); }
argsã¯å®éã«ã¯Object[]
åã§ãããgroovyã¯ãã®ã·ã°ããã£ã ãã®ã¡ãœãããæ¢ããŠããŸãã ãã§ãã¯ïŒ
http was called with [Ljava.lang.Object;@16aa0a0a https was called with [Ljava.lang.Object;@691a7f8f ServerConfig(name=MyTest, description=Apache Tomcat, http=null, https=null)
å¿
èŠãªãã®ïŒ åŒæ°ãå±éãããã©ã¡ãŒã¿ã®ã¿ã€ãã«å¿ããŠãã£ãŒã«ãå€ãèšå®ããããã ãã«æ®ããŸãã ãã®äŸã§ã¯ãClosureã¯ã©ã¹ã®1ã€ã®èŠçŽ ã®é
åãããã«æž¡ãããŸãã ããšãã°ã次ã®ããã«ããŸãã
public void methodMissing(String name, Object args) { MetaProperty metaProperty = getMetaClass().getMetaProperty(name); if (metaProperty != null) { Closure closure = (Closure) ((Object[]) args)[0]; Object value = getProperty(name) == null ? metaProperty.getType().getConstructor().newInstance() : getProperty(name); closure.setDelegate(value); closure.setResolveStrategy(Closure.DELEGATE_FIRST); closure.call(); setProperty(name, value); } else { throw new IllegalArgumentException("No such field: " + name); } }
ãã§ãã¯ãšäŸå€ã³ãŒããä¹±éã«ããªãããã«ãã»ãšãã©ãã¹ãŠã®ãã§ãã¯ãçç¥ããäŸå€ããã£ããããŸãã ãã¡ãããå®éã®ãããžã§ã¯ãã§ã¯ããããçŽæ¥è¡ãããšã¯ã§ããŸããã
ããã§ã¯ãgroovyãªããžã§ã¯ãã«åºæã®ããã€ãã®åŒã³åºãã確èªããŸãã
- ã¡ã¿ã¯ã©ã¹ãåŒã³åºããŠãåŒã³åºãããã¡ãœããã®ååããã£ãŒã«ãã®1ã€ãšäžèŽããããã«èŠããŸãã ã¡ã¿ã¯ã©ã¹ã¯ãã¹ãŠã®groovyãªããžã§ã¯ãã«ååšããã»ãŒãªãã¬ã¯ã·ã§ã³ã®ããã«æ©èœããŸããããã䟿å©ã§ãã ç¹ã«ãã¡ã¿ã¯ã©ã¹ã䜿çšãããšããã£ãŒã«ãèªäœããã©ã€ããŒãã§ããå Žåã§ãããã£ãŒã«ãã«é¢ããæ
å ±ãååŸããã¢ã¯ã»ãµãŒãä»ããŠã¢ã¯ã»ã¹ã§ããŸãã ããã¯åŸã§äŸ¿å©ã«ãªããŸãã
- åãã¡ã¿ã¯ã©ã¹ãä»ããŠãã£ãŒã«ãã®åãååŸãããã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã ããã§ã¯ãconfigã§äœ¿çšãããã¹ãŠã®ã¯ã©ã¹ã«ããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒãããããšãæåŸ
ããŠããŸãããååãšããŠãããã§å¿
èŠãªã»ã©è€éãªããžãã¯ãäœæããããšã誰ãæ°ã«ããŸããã
- getPropertyïŒïŒã§ãã£ãŒã«ãå€ãååŸããsetPropertyïŒïŒã§æ°ããå€ãèšå®ããŸãã ãããã¯GroovyObjectSupportããã®ã¡ãœããã§ãããã¢ã¯ã»ãµãŒãä»ããŠããŸãã¯çŽæ¥ããããèŠã€ãããšããã£ãŒã«ãã«ã¢ã¯ã»ã¹ããŸãã ããã«ãããç¹ã«ãã®ãã£ãŒã«ããåŸç¶ã¯ã©ã¹ã®ã©ããã«ããå Žåããªãã¬ã¯ã·ã§ã³ãŸãã¯ãã®ä»ã®ããŸã䟿å©ã§ãªãæ¹æ³ã§ãã£ãŒã«ããå€æŽããå¿
èŠããªããªããŸãã
ãããŸã§ã1ã€ã®ã¯ã©ã¹ServerConfigã«methodMissingãšãã¹ãŠã®dslãã³ãè¿œå ããŸããã Connectionã«ãåãã¡ãœãããå®è£
ã§ããŸããããªãã³ãŒããè€è£œããã®ã§ããïŒ GroovyConfigurableãªã©ã®ãã¹ãŠã®æ§æãã³ã®åºæ¬ã¯ã©ã¹ãäœæããmethodMissingã転éããŠãServerConfigãšConnectorãç¶æ¿ããŸãããã
ãã®ãããªãã® public class GroovyConfigurable extends GroovyObjectSupport { @SneakyThrows public void methodMissing(String name, Object args) { MetaProperty metaProperty = getMetaClass().getMetaProperty(name); if (metaProperty != null) { Closure closure = (Closure) ((Object[]) args)[0]; Object value = getProperty(name) == null ? metaProperty.getType().getConstructor().newInstance() : getProperty(name); closure.setDelegate(value); closure.setResolveStrategy(Closure.DELEGATE_FIRST); closure.call(); setProperty(name, value); } else { throw new IllegalArgumentException("No such field: " + name); } } } @Data public class ServerConfig extends GroovyConfigurable { private String name; private String description; private Connector http; private Connector https; } @Data public class Connector extends GroovyConfigurable { private int port; private boolean secure; }
GroovyConfigurableã¯ãã®çžç¶äººã®ãã£ãŒã«ãã«ã€ããŠäœãç¥ããªãã«ãããããããããã¯ãã¹ãŠæ©èœããŸãïŒ
ç¶æ¿
次ã®ã¹ãããã§ã¯ãèšå®ã«èŠªèšå®ãå«ããåã
ã®ãã£ãŒã«ããåå®çŸ©ã§ããããã«ããŸãã 次ã®ããã«ãªããŸãã
include 'parent.groovy' name = "prod" https { port = 8080 }
Groovyã§ã¯ãã¯ã©ã¹ãã€ã³ããŒãã§ããŸãããã¹ã¯ãªããã¯ã€ã³ããŒãã§ããŸããã æãç°¡åãªæ¹æ³ã¯ãGroovyConfigurableã¯ã©ã¹ã«includeã¡ãœãããå®è£
ããããšã§ãã ã¹ã¯ãªããèªäœãžã®ãã¹ãšããã€ãã®ã¡ãœãããè¿œå ããŸãã
Groovyconfigurable private URI scriptPath; @SneakyThrows public void include(String path) {
parent.groovyæ§æãäœæããŸããããããã§ã¯ãããã€ãã®åºæ¬çãªæ§æã«ã€ããŠèª¬æããŸãã
name = "PARENT NAME" description = "PARENT DESCRIPTION" http { port = 80 secure = false } https { port = 443 secure = true }
config.groovyã§ã¯ããªãŒããŒã©ã€ããããã®ã®ã¿ãæ®ããŸãã
include "parent.groovy" name = "MyTest" https { port = 8080 }
å®è¡çµæServerConfig(name=MyTest, description=PARENT DESCRIPTION, http=Connector(port=80, secure=false), https=Connector(port=8080, secure=true))
ã芧ã®ãšãããååã¯httpsã®ããŒããã£ãŒã«ãã®ããã«åå®çŸ©ãããŠããŸãã ãã®äžã®å®å
šãªãã£ãŒã«ãã¯ã芪èšå®ããæ®ããŸãã
ããã«é²ãã§ãæ§æå
šäœã§ã¯ãªããåã
ã®éšåãå«ããããšãã§ããŸãïŒ ãããè¡ãã«ã¯ãèšå®ãããã£ãŒã«ããGroovyConfigurableã§ããããšãmethodMissingã«ãã§ãã¯ãè¿œå ãã芪ã¹ã¯ãªãããžã®ãã¹ãæå®ããŸãã
ãã¿ãã¬èŠåºã public void methodMissing(String name, Object args) { MetaProperty metaProperty = getMetaClass().getMetaProperty(name); if (metaProperty != null) { Closure closure = (Closure) ((Object[]) args)[0]; Object value = getProperty(name) == null ? metaProperty.getType().getConstructor().newInstance() : getProperty(name); if (value instanceof GroovyConfigurable) { ((GroovyConfigurable) value).scriptPath = scriptPath; } closure.setDelegate(value); closure.setResolveStrategy(Closure.DELEGATE_FIRST); closure.call(); setProperty(name, value); } else { throw new IllegalArgumentException("No such field: " + name); } }
ããã«ãããã¹ã¯ãªããå
šäœã ãã§ãªãããã®äžéšãå«ããããšãã§ããŸãïŒ ããšãã°
http { include "http.groovy" }
http.groovyã¯
port = 90 secure = true
ããã¯ãã§ã«çŽ æŽãããçµæã§ãããå°ããªåé¡ããããŸãã
ãžã§ããªãã¯
ãµãŒããŒã®èšå®ã«ãããã³ã°ãšãã®ã¹ããŒã¿ã¹ãè¿œå ãããšããŸãã
config name = "MyTest" description = "Apache Tomcat" http { port = 80 secure = false } https { port = 443 secure = true } mappings = [ { url = "/" active = true }, { url = "/login" active = false } ]
Mapping.java @Data public class Mapping extends GroovyConfigurable { private String url; private boolean active; }
Serverconfig.java @Data public class ServerConfig extends GroovyConfigurable { private String name; private String description; private Connector http; private Connector https; private List<Mapping> mappings; }
å§ããŸã...ServerConfig(name=MyTest, description=Apache Tomcat, http=Connector(port=80, secure=false), https=Connector(port=443, secure=true), mappings=[config$_run_closure3@14ec4505, config$_run_closure4@53ca01a2])
ãã£ãš ãã¹ãŠã®æ å
ã«æ¶å»ãå
¥åããŸãã æ®å¿µãªãããéæ³ã¯ããã§çµãããæã§èªãã ãã®ãä¿®æ£ããå¿
èŠããããŸãã ããšãã°ãå¥åã®GroovyConfigurable#postProcess()
ã¡ãœããã䜿çšãã
ã³ãŒã public void postProcess() { for (MetaProperty metaProperty : getMetaClass().getProperties()) { Object value = getProperty(metaProperty.getName()); if (Collection.class.isAssignableFrom(metaProperty.getType()) && value instanceof Collection) {
ãã¡ãããããã¯ããã®ã«ãªããŸãããããã®ä»äºã¯ããŸãã ããã«ãããã¯1ã€ã®åºæ¬ã¯ã©ã¹ã«å¯ŸããŠã®ã¿èšè¿°ããŠãããããç¶æ¿è
ã«å¯ŸããŠç¹°ãè¿ãå¿
èŠã¯ãããŸããã config.postProcess();
åŒã³åºããåŸconfig.postProcess();
䜿çšå¯èœãªBeanãååŸããŸãã
ãããã«
ãã¡ãããããã§äžããããã³ãŒãã¯ãèšå®ã®ããã«å®éã®ã©ã€ãã©ãªã«å¿
èŠãªãã®ã®ã»ãã®å°ããªïŒæãåçŽãªïŒéšåã§ããããŠãŒã¹ã±ãŒã¹ãè€éã«ãªãã»ã©ãæååŠçãšãã§ãã¯ãè¿œå ããå¿
èŠãå¢ããŸãã ããšãã°ãããããåæããã¹ãããããžã§ããªãã¯ãªã©ã®ãµããŒãã ãªã¹ãã¯ã©ãã©ãå¢ããŠãããŸãããç§ã®ããŒãºã«ã¯ãèšäºã§æäŸãããã®ã§ååã§ããã ãããããªãã®å©ãã«ãªããããªãã®èšå®ãããçŸããã䟿å©ã«ãªãããšãé¡ã£ãŠããŸãïŒ