2007年9月28日金曜日

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

スズキです。

まあ、基本は"Smart Deploy"なんですが、
suz-s2-validatorとかsuz-s2-converterなどのライブラリ作ってると、
"Smart Deploy"以外のコンポーネント自動登録機能が使えると
いろいろと便利です。
http://suz-lab.googlecode.com/svn/trunk/suz-s2-converter/
http://suz-lab.googlecode.com/svn/trunk/suz-s2-validator/

で、Seasar2には3種類あります。
http://s2container.seasar.org/2.4/ja/DIContainer.html#ComponentAutoRegister

▼FileSystemComponentAutoRegister
ファイルシステムからクラスを検索しコンポーネントの自動登録を行います。

▼JarComponentAutoRegister
jarファイルからクラスを検索しコンポーネントの自動登録を行います。
※diconにてjarファイルを指定する必要があります。
<property name="jarFileNames">"junit.*"</property>

▼ComponentAutoRegister
ファイルシステム、jarファイル両方からクラスを検索しコンポーネントの自動登録を行います。
※クラス検索対象のディレクトリ、jarファイルを特定するための、クラス(なんでもいい)を指定ます。
<initMethod name="addReferenceClass">
  <arg>@aaa.bbb.ccc.ddd.HogeImpl@class</arg>
</initMethod>

実際問題、ライブラリは開発するときは、ファイルシステム、使うときは
jarファイルにクラスがあるはずなので、おのずと、
ComponentAutoRegisterの利用がしっくりきます。

ただ、addReferenceClassで適当なクラスを指定することが、
気持ち悪いといえば悪いですが、大体、こういうときは、
ベースとする抽象クラスつくっているので、
それを指定することにしとけば、そこまで気持ち悪いってほどでもありません。

実際はこんな感じで書いてます。

-------
<component
  class="org.seasar.framework.container.autoregister.ComponentAutoRegister">
  <property name="instanceDef">
    @org.seasar.framework.container.deployer.InstanceDefFactory@PROTOTYPE
  </property>
  <initMethod name="addReferenceClass">
    <arg>
      @jp.co.iret.suz.s2.converter.teeda.impl.AbstractConverterImpl@class
    </arg>
  </initMethod>
  <initMethod name="addClassPattern">
    <arg>"jp.co.iret.suz.s2.converter.teeda.impl"</arg>
    <arg>".*ConverterImpl"</arg>
  </initMethod>
</component>
--------
http://suz-lab.googlecode.com/svn/trunk/suz-s2-converter/src/main/resources/suz-s2-converter.dicon-

最初(半年前)、addReferenceClassが何なのか、まったくわからず、
ComponentAutoRegisterが使えなかったんだよなー。

--
blog: http://suz-lab.blogspot.com/

0 コメント: