Java
JavaEE
Weld
CDI

JavaSE 環境でCDI(Weld)を使う

More than 5 years have passed since last update.

CDI のリファレンス実装である Weld を使って、 JavaSE 環境上で CDI を使う方法をメモする。


環境


OS

Windows7 64bit


Java

1.7.0_25


Weld

1.1.10.Final


準備


Weld の入手

Weld の jar ファイルをダウンロードする。

jar は公式サイトからダウンロードできる。


実装


weld-se.jar をクラスパスに追加する

ダウンロードした zip ファイル(weld-1.1.10.Final.zip)を解凍したら、weld-1.1.10.Final\artifacts\weld\weld-se.jar をクラスパスに追加する。

この jar に必要なライブラリとかが全部入っているらしい。中を見ると、 javassist とかが入ってる。


beans.xml の配置

クラスパスが通っている場所に META-INF というフォルダを作成し、 beans.xml というファイルを作成する。

ファイルは作るだけで、中は空で良い。

これは CDI の仕様上必要なファイルで、このファイルがあると CDI が有効になる。多分。


Java の実装

簡単な Hello World を実装してみる。


MyApplication.java

package cdi;

import javax.inject.Inject;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class MyApplication {

public static void main(String[] args) {
Weld weld = new Weld();
WeldContainer container = weld.initialize();
MyApplication application = container.instance().select(MyApplication.class).get();
application.run();
weld.shutdown();
}

@Inject
private Speaker speaker;

public void run() {
this.speaker.speak();
}
}



Speaker.java

package cdi;

public interface Speaker {
void speak();
}



EnglishSpeaker.java

package cdi;

public class EnglishSpeaker implements Speaker {

@Override
public void speak() {
System.out.println("Hello World!!");
}
}



実行結果

Hello World!!



説明


MyApplication.java

public class MyApplication {

public static void main(String[] args) {
Weld weld = new Weld();
WeldContainer container = weld.initialize();
MyApplication application = container.instance().select(MyApplication.class).get();
application.run();
weld.shutdown();
}
}


Java SE 環境で CDI(Weld)を使用する場合は、最初に Weld のコンテナを初期化する。

ここでは、 MyApplication の main メソッドでコンテナの初期化をしている。

コンテナの初期化は、 Weld#initialize() メソッドで実行。

取得した WeldContainer から、 MyApplication クラスのインスタンスを取得し、その後の処理を実行している。

最後は Weld#shutdown() メソッドでコンテナを終了させる。


Eclipse プロジェクトの様子

cdi-se-eclipse.jpg


参考