Injection)を使う際には、いくつか注意すべきポイントがある。7徹底入門』の著者が解説する。7の初級者向け解説をお届けしている。7におけるビジネスロジック層の開発技術であるCDIを使う際の注意点について解説する。7徹底入門』では5~6章でCDIとEJBによるビジネスロジックの開発について解説していますが、刊行後に1つご指摘をいただいたことがあるので、初めにそれについて触れておきたいと思います。7徹底入門』では、主に5章で「CDIの利用」、6章で「EJBの利用」について解説しています。EJB」や「選択」といった表現を使いましたが、これにより、読者の皆さんにCDIとEJBは排他的な関係にあるという印象を抱かせてしまったかもしれません。実際にコンサルティングの現場でも、お客様から「CDIとEJBはどちらを使えばよいのか」といった質問をされることがありますが、両者は決して排他的な関係にはありません。現実的には、両者を組み合わせて課題を解決するのが善作だと考えています。本書に記載されている内容に、この点について一部誤解を生じさせるような記載があったようですので、それについてお詫びいたします。7徹底入門』に書かなかったこと/書けなかったことを中心に取り上げていきたいと思います。スコープ定義を覚えることがCDI活用の第一歩まずCDIについて簡単におさらいしておきましょう。Injection」の略称です。Injection(DI)とは、アプリケーションを構成する複数の"層"をつなげる役割を果たす技術であり、初めにインタフェースを定義し、そのインタフェース間でのオブジェクトのやり取りを実装するというかたちで使います。CDIの特徴は、アプリケーションの動作に必要となるオブジェクトを、必要となったタイミングで取得するための仕組みを備えている点であり、そのために「スコープ定義」を使います。スコープの中にあるオブジェクトをどのように扱うかが、CDIを使ううえでの重要なポイントになります。それでは、「スコープ定義」とは、どのようなものでしょうか。スコープ定義を書くと、「@Inject」というアノテーションを使い、プログラム内の任意の個所でインジェクション(Injection。オブジェクトの注入)が行えるようになります。主なスコープには「@RequestScoped」、「@ViewScoped」、「@SessionScoped」、「@ApplicationScoped」、「@ConversationScoped」の5つがあります。これらのスコープの定義をきちんと覚え、各スコープにおけるオブジェクトのライフサイクルを意識すれば、CDIの基本機能が使えます。CDIの使い方を図示すると、下図のようになります。ご覧のとおり、サーブレットなどのプログラムで、変数名の部分に「@Inject」というアノテーションを付けておきます。CDIによって呼び出されるJavaクラス(CDIビーン)の側では、そのクラスをインジェクションできるスコープを定義します。すると、サーブレットが呼び出された際、定義したスコープでCDIビーンのインスタンスが生成/代入されて使えるようになります。CDIとEJBの違いこのように、CDIは非常に簡単で便利な仕組みであり、極論すればスコープ定義さえ覚えれば使うことができます。EJBコンポーネントの場合、呼び出しと同時に必ずトランザクションが立ち上がりますが、CDIでは不要であればトランザクションを使わなくてもよいため、リソース面のメリットが期待できます。EJBを使う場合、通常はアプリケーション・サーバ側でEJB用のリソース・プールが確保されます。キャッシュとして存在するため適切にチューニングするのが難しいのですが、CDIではスコープが細かく分かれているので、必要なときに必要な数だけオブジェクトを使い、終わったらすぐに解放するといったことができます。「使いたい場面で使い、使い終わったらすぐに片付ける」というのが、CDIを使う場合の理想的なかたちです。先ほど、CDIはアプリケーションで複数の"層"をつなぐものだと説明しました。プレゼンテーション層とは、第1回で取り上げたJSFなどで作る層です。業務ロジック層とは、ビジネスロジックを定義する層です。CDIはビジネスロジックの作成に使えるため、上の図ではこの層の上にCDIを配置しています。実際には各層をつなぐ役割を果たすので、他の層にも関係します。CDIの役割は非常に幅広いため、実際にアプリケーションを作ってみたら下図のような構成になったということもよくあります。なると、アプリケーションの大半がCDIによって作られることになります。CDIは、もともと各層の"接着剤"として利用することが前提にあるため、このような適用範囲の広い使われ方が想定されます。開発の際には、どの層で利用するオブジェクトなのか、どこで参照が切れるのかを意識し、スコープ定義をうまく制御することが求められるでしょう。お試しいただけるトライアル・サービスをご提供しております。permission.×このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。