第4回 GBean×DI徹底解剖Apacheの戦士Geronimoが持つ実力(1/2 ページ)

コンポーネントの疎結合化・再利用を促す手法であるDI(Dependency Injection)ですが、Geronimoカーネルの最大の特徴は、GBeanの取り扱いにこのDIの考え方を取り入れている点と言えるかもしれません。今回は、GBeanに活用されているDIの仕組みを紹介します。

» 2007年03月27日 12時00分 公開
[中山清喬、杉田直哉,ITmedia]

 最近「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 図1 GBeanの疎結合を実現するDI機構

GBeanInfoによるGBean情報の記述

 GBeanが表1に示すような属性、操作、依存関係などの自身のスペック情報を公開するために、GBeanInfoクラスが用意されています。通常このクラスの生成は、直接newを用いず、GBeanInfoBuilderを用います。具体的には、リスト1のようにGBeanInfoクラスをstaticメンバーとして持たせ、static初期化内で属性や操作を設定し、getGBeanInfoメソッドでカーネルに公開します。

表1 表1 GBeanInfoが公開/管理する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の起動 …         :         :
リスト1 ライフサイクルとDIを利用するGBeanクラスの雛形
       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ