groovy grovletから別groovyファイルを読み込む - クラスローダー使用版
2007/07/17
groovy
java
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
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"
}
}
static void main(args) {
print z.ok()
}
static public String ok(){
"ok o_o! ok"
}
}
: