LoginSignup
19
18

More than 5 years have passed since last update.

JavaSE 環境でCDI(Weld)を使う

Last updated at Posted at 2013-08-18

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

参考

19
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
18