groovy grovletから別groovyファイルを読み込む - クラスローダー使用版 2007/07/17

groovletから別のgroovyを読み込む方法です。

シナリオ:

groovletから別のgroovyファイルに定義されたクラスを利用したい。


ちょっと調べた範囲だと、groovletからクラスローダーを使用してインスタンスをつくるという方法しかないような...

DIコンテナを使用して、上から依存するオブジェクトを渡す(注入する)というのがベストな解な感じがしますが、そうするとDIコンテナに依存してしまうのがちょっと嫌かな。

groovletからクラスローダーを使用してgroovyファイルを読み込むサンプルです。
groovletと同じ場所にgroovyファイルがあることを想定しています。

しかし、この方法だと毎回コンパイルしているのだろうか?
要調査。

ベースのコードはgrooveletのサンプルです。

import java.util.Date
import java.lang.ClassLoader
import groovy.lang.GroovyClassLoader

if (session == null) {
session = request.getSession(true);
}

if (session.counter == null) {
session.counter = 1
}

ClassLoader parent = getClass().getClassLoader();
GroovyClassLoader loader = new GroovyClassLoader(parent);
Class groovyClass = loader.parseClass(new File(context.getRealPath('/') + 'z.groovy'));

// let's call some method on an instance
GroovyObject z = (GroovyObject) groovyClass.newInstance();

println """
<html>
<head>
<title>Groovy Servlet</title>
</head>
<body>
Hello, ${request.remoteHost}: ${session.counter}! ${new Date()} ${ z.ok() }
</body>
</html>
"""
session.counter = session.counter + 1



class z {

static void main(args) {
print z.ok()
}

static public String ok(){
"ok o_o! ok"
}
}

: