レベル: 初級 万仲龍樹・中山清喬・杉田直哉・津田嘉孝, 日本アイ・ビー・エム システムズエンジニアリング株式会社
2007年 05月 25日 コンポーネントの疎結合化・再利用を促す手法であるDI(Dependency Injection)ですが、Geronimoカーネルの最大の特徴は、GBeanの取り扱いにこのDIの考え方を取り入れている点と言えるかもしれません。今回は、GBeanに活用されているDIの仕組みを紹介します。
最近「DI(Dependency Injection)」という言葉をよく耳にするようになりました。DIとは、コンポーネントの疎結合化・再利用を促す手法として非常に注目されています。コンポーネント内部にほかのコンポーネントへの依存を直接記述せず、外部ファイルに定義します。稼働時はDIコンテナと呼ばれる軽量コンテナによって依存性が注入されることによって、柔軟性・再利用性を確保します(詳細については、書籍「Seasar入門 はじめてのDI&AOP」のほか、各種技術サイト、技術ブログなどが参考になると思います)。
そして、Geronimoカーネルの最大の特徴は、GBeanの取り扱いにこのDIの考え方を取り入れている点だといわれます。特にGeronimoが統合するミドルウェアコンポーネントは、各オープンソースコミュニティーにおいて自由に独立して開発が進められますので、コンポーネント同士がお互いに依存することなくうまく連携できるためにも、DIカーネルは欠かせない基盤となっています。
ここからは、GBeanに活用されているDIの仕組みについてフォーカスしていきましょう。
GBeanのDependency Injection機構
JBoss4でもマイクロカーネルアーキテクチャーが採用されていますが、図1のようにMBean同士はお互いを知る必要があります。一方、Geronimoカーネルは極力GBean同士の依存関係を排除できるような仕組みを備えています。GBeanクラス自体はPOJO*として開発できますが、幾つかの約束事に従ってGBeanのスペック情報を公開することで、カーネルによるDIや永続化機構の恩恵にあずかれます。
図1 GBeanの疎結合を実現するDI機構
拡大図
GBeanInfoによるGBean情報の記述
GBeanが表1に示すような属性、操作、依存関係などの自身のスペック情報を公開するために、GBeanInfoクラスが用意されています。通常このクラスの生成は、直接newを用いず、GBeanInfoBuilderを用います。具体的には、リスト1のようにGBeanInfoクラスをstaticメンバーとして持たせ、static初期化内で属性や操作を設定し、getGBeanInfoメソッドでカーネルに公開します。
表1. GBeanInfoが公開/管理するGBeanの情報
拡大図
リスト1 ライフサイクルとDIを利用するGBeanクラスの雛形
public class MyGBean implements GBeanLifecycle
{
private static final GBeanInfo GBEAN_INFO;
public static GBeanInfo getGBeanInfo() { return GBEAN_INFO; }
static
{
GBeanInfoBuilder factory = new GBeanInfoBuilder(MyGBean.class.getName(), MyGBean.class);
factory.addAttribute("name", String.class, true);
GBEAN_INFO = infoFactory.getBeanInfo();
}
private String name;
public String getName() { return name; }
public void setName(final String name) { this.name = name; }
public void doStart()
{
// middlewareの起動 …
:
:
|
属性のインジェクション
プランファイル中にattributeタグを記述しておくと、デプロイ時に値をGBeanに注入してくれます。例えば、リスト1の例ではGBeanクラスでgetName()/setName()を実装し、GBeanInfoにname属性として公開しているため、次のようなプランファイルを記述するとデプロイ時にsetName("ISE")が呼ばれ、値が注入されます。
<attribute name="name">ISE</attribute>
|
前記はsetterインジェクションの例ですが、Geronimoカーネルはコンストラクタインジェクションもサポートしています。具体的には、まずGBeanInfoBuilder#setConstructorを使い、コンストラクタのメソッド名と各パラメータの論理名を定義します。次に、プランファイル内でattributeやreferenceタグで論理名と値を指定することで実現します。例えば、前記のプランファイル記述例の場合、GBeanのコンストラクタの第1パラメータ名がnameであると公開しておくと、GBean生成時に第1パラメータに「ISE」が渡ってくることになります。
依存するGBeanのインジェクション
プランファイルのreferenceタグ*でほかのGBeanの名前を指定することで、そのGBeanへの参照を注入できます。例えば、GBeanAに対して次のようなプランファイル記述があると、デプロイ時に名前がMyGBeanNameであるGBeanが探され、GBeanA#setMyObj()を呼んでセットしてくれます。
<reference name="myObj">
<name>MyGBeanName</name>
</reference>
|
GBeanInfoによる自動永続化
属性や依存の注入はデプロイ時に行われますが、その情報がGeronimo再起動で失われないよう、開発者が状態保持のコードを書く必要はありません。実はGBeanInfoはDIだけでなく、内容の永続化でも利用されます。属性や依存などの内部状態は、Geronimo停止時に自動保存、起動時には自動復元*されます。
なお、カーネルに自動永続化されたくないGBean属性がある場合は、GBeanInfoBuilder#addAttributeする際のpersistent引数(第3引数)をfalseとして指定してください。
GBeanのライフサイクル
GBeanは図2に示すようなライフサイクルを持ちます。GBeanに対してGBeanLifecycleインタフェースを実装することで、ライフサイクルの変化に伴ってdoStart、doStop、doFailの各メソッドがカーネルから呼び出されるようになります。多くのGBeanでは、統合するミドルウェア本体の起動や停止などのためにGBeanLifecycleを実装することになるでしょう。
図2 GBeanのライフサイクル
拡大図
コラム:プランファイルの内容は、デプロイ後どうなるのか
プランファイルはデプロイ後に不要になります。内部で定義されていたグループ化情報とGBean設定情報はどうなるのでしょうか。
デプロイ時
グループ化情報はコンフィギュレーションとして解釈されます。また、プランファイルに記述された外部設定情報は、DI機構によってGBeanにセットされ、コンフィグストアと呼ばれる領域に丸ごと直列化され保存されます。プランファイルが役割を終えるのは、GBean内部に情報が取り込まれるからです。
起動時
カーネルは指定されたコンフィギュレーションをストアから読み出して起動します。それに伴い、コンフィギュレーション配下の全GBeanがストアから内容復元され起動します。起動完了によりコンフィギュレーションさえも役割を終え、稼働時は「GBeanだけの世界」になります。
図A プラン/JARファイルが活用されるまで
拡大図
このページで出てきた専門用語
-
POJO
- Plain Old Java Objectの略。特定のインタフェースやクラス派生を強制されない、単純なクラスのこと。Geronimoでは、既存のあらゆるクラスも(空クラスでさえ)GBeanとしてデプロイが可能です。
-
referenceタグ
- referencesタグで正規表現ライクな指定を行い、複数の参照をセットすることも可能です。
-
起動時には自動復元
- <GERONIMO_HOME>/config-store以下にあるserファイルに、永続化されたGBeanInfoの姿を見ることができます。起動時、serファイルから丸ごとGBeanInfoが復元されます。
まとめ
2回にわたってGeronimoの根幹をなすアーキテクチャーを紹介しました。特にカーネルのDI機構は、周辺コンポーネントを抽象化したGBean同士を疎結合に保ったままで連携可能にしてくれる強力な仕組みです。Eclipseが優れたプラグインアーキテクチャーによって「統合クライアント環境」の可能性を見せるように、Geronimoの「統合サービス環境」の可能性に期待したいと思います。
次回からは統合の実例として、近年注目を集めるRubyのランタイム環境をGeronimo上に統合してみます。
参考文献
著者について  | |  | 万仲龍樹・中山清喬・杉田直哉・津田嘉孝
日本アイ・ビー・エム システムズエンジニアリング株式会社
日本アイ・ビー・エム システムズ・エンジニアリング株式会社(ISE)は、日本アイ・ビー・エムグループにおけるSE技術者の専門家集団として1992年7月に設立されました。発足以来、IBM製品を中心とした難易度の高い複雑なシステム構築や先進技術の適用場面において、卓越したITスキルによりお客様と開発現場を支援してきました。近年は、仮想化技術・グリッドコンピューティング・Web 2.0・オープンソースソフトウェア等々の先進技術分野での支援も展開しています。 |
記事の評価
|