スポンサード リンク

その2 Seasar2 コンポーネントの自動登録

ページ 目次

  1. コンポーネントの自動登録
スポンサード リンク

1.コンポーネントの自動登録

前回は複数のコンポーネントを登録するための手順を記載しました。
ただ、実際に使っていく際に、毎度コンポーネントを設定ファイルに記載しなければならないとなると大きな
手間になってしまい、開発の作業のテンポが悪くなってしまいます。
そこで今回はSeasar2に用意されているコンポーネントの自動登録を行ってみたいと思います。

前回使用した設定ファイルsample.diconは以下のようになっていました。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
    <component name="Seasar2ServiceSample" class="sample.seasar2.Seasar2ServiceSampleImpl"/>
    <component name="Seasar2ServiceSample2" class="sample.seasar2.Seasar2ServiceSample2Impl"/>
</components>
	

使用しているコンポーネントごとに、<component/>タグを追加しています。 Seasar2に用意されている自動登録機能を用いて自動登録するようにしたいと思います。 以下に修正後のsample.diconファイルを記載します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
    <!-- 個別のコンポーネントの登録の部分をコメントアウト
    	<component name="Seasar2ServiceSample" class="sample.seasar2.Seasar2ServiceSampleImpl"/>
    	<component name="Seasar2ServiceSample2" class="sample.seasar2.Seasar2ServiceSample2Impl"/>
    -->
    <!-- コンポーネントの登録用設定 -->
    <component
    	class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
    	<property name="autoNaming">
    	  <component class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
    	</property>
    	<initMethod name="addClassPattern">
    	  <arg>"sample.seasar2"</arg>
    	  <arg>".*Impl"</arg>
    	</initMethod>
    </component>
</components>
	

となります。
個別のコンポーネントを登録しているところをコメントアウトしています。
コンポーネント登録用の設定として以下の部分を追記しています。

<!-- コンポーネントの登録用設定 -->
<component
	class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
	<property name="autoNaming">
	  <component class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
	</property>
	<initMethod name="addClassPattern">
	  <arg>"sample.seasar2"</arg>
	  <arg>".*Impl"</arg>
	</initMethod>
</component>
	

追加した部分を見てみます。
まずcomponentタグのclassに
class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister"
にてフォルダ構成に含まれるクラスを自動登録するためのクラスを設定します。
次にpropertyタグのname属性にautoNamingを設定します。
使用しているクラスとして
org.seasar.framework.container.autoregister.DefaultAutoNaming
initMethodのname属性としてaddClassPatternを設定しています。
引数として、"sample.seasar2",".*Impl"としています。
ここで重要なキーワードとなるのは、引数の"sample.seasar2",".*Impl"の2つになります。
まず一つ目の引数である"sample.seasar2"の部分には自動登録したいクラスの保存パッケージ名を記載します。
サンプルの場合だと、登録したいコンポーネントのパッケージ"sample.seasar2"となっています。
次に2つ目の引数である、".*Impl"の部分には登録したいコンポーネントのファイル名を記載します。
このときに正規表現が使用できます。
サンプルの場合には、ファイル名がSeasar2ServiceSampleImplとSeasar2ServiceSample2Implなので
ファイル名の最後がImplとなっていたら登録してもらうようにします。
ここで気になるのが、自動登録したコンポーネントはどうやって呼び出すんだろうということです。
登録名は、登録されたコンポーネントのファイル名から、Implを除去した名前になります。
サンプルの場合、Seasar2ServiceSampleImplはSeasar2ServiceSampleとなります。
では、実際に修正したファイルを用いて、実行してみます。

DEBUG S2Containerを作成します。path=sample/seasar2/sample.dicon
DEBUG S2Containerを作成しました。path=sample/seasar2/sample.dicon
INFO  Running on [ENV]product, [DEPLOY MODE]Normal Mode
サンプルクラスの作業を実行します.
サンプルサービス2.の実装クラスを処理しました
	

正常に実行されました。
ただ、何が登録されており何が登録されていないかわからないです。
そこで何がコンポーネントとして登録されているのかを表示するための簡単なメソッドを作成してみました。
簡易表示のため,logを使用する形ではなく、System.out.printlnで表示させています。

    /**
     * 登録しているコンポーネントを表示する.
     * @param container コンテナ
     */
    private static void displayComponent(S2Container container) {
        // 登録しているコンポーネントを表示する。
        for (int i = 0; i < container.getComponentDefSize(); i++) {
            String compName = container.getComponentDef(i).getComponentName();
            Class className = container.getComponentDef(i).getComponentClass();
            if (compName != null && className != null) {
                System.out.println("コンポーネント名 : " + compName
                                       + " : クラス名 : " + className.toString());
            }
        }
    }
	

以上のメソッドを、コンテナの取得後に、組み込んで実行してみます。
組み込んだ後の実行結果は以下のようになります。

DEBUG S2Containerを作成します。path=sample/seasar2/sample.dicon
DEBUG S2Containerを作成しました。path=sample/seasar2/sample.dicon
INFO  Running on [ENV]product, [DEPLOY MODE]Normal Mode
コンポーネント名 : seasar2ServiceSample2 : クラス名 : class sample.seasar2.Seasar2ServiceSample2Impl
コンポーネント名 : seasar2ServiceSample : クラス名 : class sample.seasar2.Seasar2ServiceSampleImpl
サンプルクラスの作業を実行します.
サンプルサービス2.の実装クラスを処理しました
	

コンポーネント名 : seasar2ServiceSample2 : クラス名 : class sample.seasar2.Seasar2ServiceSample2Impl
コンポーネント名 : seasar2ServiceSample : クラス名 : class sample.seasar2.Seasar2ServiceSampleImpl
という実行結果が表示されていると思います。
このように、コンポーネントを設定ファイルにすべて書くのではなく、ある程度の規則(規約)を守ることで作業を減らすことができます。
Convention over Configration」(規約に則ることで様々な省力化をしてくれる)
これも作業を簡略化する上で大切な要素だと思います。



Seasar2 Topに戻る
inserted by FC2 system