Groovyも1.0になったし、動的なクラス生成を使ってインターフェースレスにDIコンテナを使うのが、ナウなヤングにトレンディかも…と考えて、少し触ってみる。
依存するライブラリは次の通り。
- asm-2.2.jar
- antlr-2.7.5.jar
- groovy-1.0.jar
- nanocontainer-1.0.jar
- picocontainer-1.2.jar
コンポーネント
public class Foo { private Bar bar; private Zoo zoo; public Foo(Bar bar, Zoo zoo) { this.bar = bar; this.zoo = zoo; } public void func() { System.out.println("Foo#func()"); bar.func(); zoo.func(); } } public class Bar { private Baz baz; public Bar(Baz baz) { this.baz = baz; } public void func() { System.out.println("Bar#func()"); baz.func(); } } public class Zoo { public void func() { System.out.println("Zoo#func()"); } } public class Baz { public void func() { System.out.println("Baz#func()"); } }
エントリクラス
public class Main { public static void main(String[] args) { try { Main main = new Main(); main.__main__(args); } catch (Exception e) { e.printStackTrace(); } } private void __main__(String[] args) throws Exception { PicoContainer pico = buildContainer(); Foo foo = (Foo) pico.getComponentInstanceOfType(Foo.class); foo.func(); } private PicoContainer buildContainer() throws FileNotFoundException { Reader script = new FileReader("nanocontainer.groovy"); GroovyContainerBuilder builder = new GroovyContainerBuilder(script, getClass().getClassLoader()); ObjectReference containerRef = new SimpleReference(); builder.buildContainer(containerRef, new SimpleReference(), null, true); return (PicoContainer) containerRef.get(); } }
Groovyスクリプト
import pico_nano.*
pico = builder.container(parent:parent) {
component(class:Foo)
component(class:Bar)
component(class:Zoo)
component(class:Baz)
}
実行結果
Foo#func() Bar#func() Baz#func() Zoo#func()