ksino's diary

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

CDIでインジェクトするクラスを切り替える

やりたいこと

CDIでインジェクトするCDIビーンを切り替える方法にはいくつかありますが、ここでは@Alternativeとbeans.xmlを使います。

実装

CDIビーン

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

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

import javax.enterprise.inject.Alternative;

@Alternative
public class Superman implements Hero {
    @Override
    public void showName() {
        System.out.println("スーパーマン");
    }
}
package jp.gr.java_conf.ksino.weldtest.cdibeans;

import javax.enterprise.inject.Alternative;

@Alternative
public class Batman 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();
    }
}

META-INF/beans.xml

<beans>
    <alternatives>
        <class>jp.gr.java_conf.ksino.weldtest.cdibeans.Batman</class>
    </alternatives>
</beans>

実行結果

バットマン