@Producesを使って動的に生成するクラスを切り替える
次に、動的に生成クラスを切り替える方法です。前回紹介したサイコロの例では、限定子を使って生成されるクラスを切り替えました。限定子をつけるだけで簡単にクラスを変更できたのですが、限定子をハードコーディングしていることから、クラスを動的に切り替えることはできないため、柔軟性に欠けます。そこで、@Producesを用いて動的に生成クラスを切り替える方法について学びます。
次の例は、@Producesを使って動的にサイコロを切り替えるコードです。
@Producesを使って動的にサイコロを切り替える Generator.java]
package sample.beans;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.enterprise.inject.Produces;
import javax.inject.Named;
@SessionScoped …(1)
@Named("generator") …(1)
public class Generator implements Serializable {
private int diceType;
/**
* サイコロの種類を指定する
* @param value サイコロの種類を指定
*/
public void changeDice(int value) { …(2)
diceType = value;
}
@Dice
@Produces
public IDice getDice() { …(3)
IDice dice = null;
// diceTypeの値に応じて生成するインスタンスを切りかえる
switch (diceType) {
case 0:
// SimpleDiceを生成
dice = new SimpleDice();
break;
case 1:
// ExtendDiceを生成
dice = new ExtendDice();
break;
default:
}
return dice;
}
}
(1)GeneratorクラスがManagedBeanとして管理されます。@Namedでfaceletsから参照する時の名称、@SessionScopedでセッション単位で有効になります。
(2)サイコロの変更指示をメソッドの引数で管理します。diceTypeに値が格納されます。
(3)diceTypeの値に応じてサイコロのインスタンスを生成します。太字の部分にて限定子@Diceと@Producesを指定しているため、CDIコンテナはサイコロの取得処理をこのメソッドで行います。
これでサイコロの生成ロジックはこのGeneratorに移しましたので、前回作成したSimpleDiceとExtendDiceからは限定子@Diceを消去しておきます。
画面からは、ボタンでサイコロを切り替えるように変更します。
動的にサイコロを切り替える画面 index.xhtml]
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>乱数の取得</title>
</h:head>
<h:body style="font-size: 18px">
#{sample.message}から取得した値<br />
#{sample.nextValue()}
<h:form id="form1">
<h:commandButton id="simple"
value="通常のサイコロ" action="#{generator.changeDice(0)}" />
<h:commandButton id="extend"
value="大きな目のサイコロ" action="#{generator.changeDice(1)}" />
</h:form>
</h:body>
</html>
追加した箇所は、太字で示した送信フォーム<h:form>と、送信ボタンである<h:commandButton>です。<h:commandButton>のaction属性にて、GeneratorクラスのchangeDice()メソッドを呼び出し、サイコロの種類を指定します。
変更が完了したら、アプリケーションを起動してブラウザで稼働確認をしましょう。起動後は次のように通常のサイコロの結果が表示されます。

次に「大きな目のサイコロ」ボタンを押すと、大きな目のサイコロを振った結果とExtendDiceが実行されたことを示すメッセージが表示されました。

このように、CDIを使った依存性注入はとても手軽に使うことができ、簡単にカスタマイズして自由に依存性注入できることがご理解できたかと思います。
まとめ
以上、JavaEE6でアプリケーションを構築する方法と、CDIを使ったクラスの管理方法について紹介しました。アプリケーションを手軽に構築しながらクラス間の依存性を取り除き、変更に強いクラス構成が可能なことを理解していただければと思います。
この記事は参考になりましたか?
既に会員の方はを行ってください。
- Java EE 6 開発入門連載記事一覧
-
- JAX-RSを使ったWebサービスのカスタマイズ
- JAX-RSを使ったWebサービスの作成
- CDIを利用したサンプルアプリーケションの作成
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 東 浩二(アズマ コウジ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
