はじめに
DIコンテナのオブジェクト依存性の注入定義には、XMLベースの設定ファイルを用いることが主流ですが、「ツール無しでは視認性が悪い」「記述が面倒」といった使いにくさから、あまり手軽ではないと感じる時があります。
そこで、「変更容易な外部ファイルでDIの定義を行う」という前提で、もっと手軽に使える手段としてスクリプト言語を利用する事を考えてみました。
実装手段として、Java SEの次期バージョンJava SE 6で採用予定のJSR223(Scripting for the Java Platform)仕様を用いた場合と、現J2SE 5.0で実現する場合の2通りを考える事とし、以下のスクリプト言語を採用しました。
- JavaScript(Java SE 6環境)
- Groovy(J2SE 5.0環境)
必要な環境
もしくは
共通インターフェイス・クラスの作成
Java SE 6とJ2SE 5.0で共通的に利用するインターフェイスとクラスを作成します。
DI対象となるインターフェイス・クラスの作成
オブジェクト依存性の注入対象とするインターフェイスとクラスを作成します。
何らかのサービスを提供するService
インターフェイス、その実装クラスである複数のService実装クラスを順次実行するMultiService
クラス、標準出力に文字を出力するPrintService
を用意します。
public interface Service { void service(); }
import java.util.ArrayList; public class MultiService implements Service { private ArrayList<Service> list = new ArrayList<Service>(); public void addService(Service service) { this.list.add(service); } public void service() { for (Service service : this.list) { service.service(); } } }
public class PrintService implements Service { private String name; public PrintService(String name) { this.name = name; } public void service() { System.out.println(this.name); } }
スクリプト言語側で実装するためのインターフェイス作成
スクリプト言語側で定義したクラス(もしくはオブジェクト)をJavaのコードから利用するために、Javaで定義したインターフェイスをスクリプト言語側で実装するようにします。
そのためのインターフェイスとしてTestContainer
を用意します。
public interface TestContainer { Object getComponent(String name); }