ksino's diary

覚えたことを忘れないように、小さなことでも書いていく。

JavaSE環境でCDIを試したい

やりたいこと

JavaSE環境でCDIを試したい。
どうやらWeldでできるようです。

環境

Oracle JDK 1.8.0_77(64bit)

準備(pom.xml)

<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se</artifactId>
    <version>2.3.3.Final</version>
    <scope>compile</scope>
</dependency>

コード

CDIビーン

package jp.gr.java_conf.ksino.weldtest.cdibeans;

public interface Hero {
    public void showName();
}
package jp.gr.java_conf.ksino.weldtest.cdibeans;

public class Superman implements Hero {

    @Override
    public void showName() {
        System.out.println("スーパーマン");
    }
}

インジェクションポイント

package jp.gr.java_conf.ksino.weldtest.logic;

import javax.inject.Inject;
import jp.gr.java_conf.ksino.weldtest.cdibeans.Hero;

public class Logic {
    @Inject
    private Hero hero;
    
    public void call() {
        hero.showName();
    }
}

実行コード

package jp.gr.java_conf.ksino.weldtest;

import javax.enterprise.inject.Instance;
import jp.gr.java_conf.ksino.weldtest.logic.Logic;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class Main {
    
    public static void main(String[] args) {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();
        Instance<Logic> instance = container.select(Logic.class);
        Logic logic = instance.get();
        logic.call();
        weld.shutdown();
    }
    
}

beans.xml

クラスパス配下にMETA-INF/beans.xmlを配置する。
とりあえず空ファイルで良い。