[Seasar-user:4016] Re: 2つのプロジェクト間でのDIが行われない

吉岡 武志/インフォセンス [E-MAIL ADDRESS DELETED]
2006年 7月 4日 (火) 10:11:20 JST


吉岡です。

> DI される側のコンポーネントはどの dicon に定義 (あるいは自動登録)
> していますか?
> そのコンポーネントが子供のコンテナにいると,まずはそのコンテナ
> つまり main 側の dicon からコンポーネントが検索されます.

test側に定義していると思っていますが、勘違いしているかもしれませんので
以下がdicon定義を記します。

[main側のdicon]
<component class
="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
    <property name="autoNaming">
        <component class
="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
    </property>
    <initMethod name="addClassPattern">
        <arg>"jp.co.sample.dao"</arg>
        <arg>".*Dao"</arg>
    </initMethod>
</component>

[test側のdicon]
<include path="main側のdicon"/>

<component class
="org.seasar.framework.container.autoregister.ComponentAutoRegister">
    <property name="autoNaming">
        <component class
="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
    </property>
    <initMethod name="addClassPattern">
        <arg>"jp.co.sample.dao"</arg>
        <arg>".*Dao"</arg>
    </initMethod>
    <initMethod name="addReferenceClass">
        <arg>@[E-MAIL ADDRESS DELETED]</arg>
    </initMethod>
</component>

> test 側が DI されるようになったのではなく,main 側の
> JobDaoImpl が DI されているだけではないかと思います.

どちらの(main側 or test側)クラスがDIされたか分るように
ログを出力していたのですが、test側がDIされているようでした。

> おそらく,吉岡さんがやりたいことを実現するには dicon の
> 構成を変える必要があると思います.
> どんなコンポーネントがあり,どのコンポーネントに
> どのコンポーネントを DI したいのかを簡単に書き出して
> いただけないでしょうか?

小林さんとやりとりをさせて頂いて、私のdicon定義の仕方(考え方)が根本的に間
違っている
気がします。ただ、どこがどう間違っているかが私自身理解ができていませんので
以下に、どういったことがやりたいのか簡単に記述させて頂きます。

■パッケージ階層
 [mainProject] -- Mainプロジェクト
       + jp.co.sample.dao
           ・JobDao.java
           ・JobDaoImpl.java
       + jp.co.sample.dbaccess
           ・CountryDao.java
       + jp.co.sample.service
           ・JobService.java
           ・JobServiceImpl.java
       + jp.co.sample.dicon
           ・実装用のdiconファイル(main.dicon)
 [testProject] -- Testプロジェクト
       + jp.co.sample.dao
           ・MockJobDaoImpl.java
       + jp.co.sample.service
           ・JobServiceTestCase.java
       + jp.co.sample.dicon
           ・テスト用のdiconファイル(test.dicon)

・JobServiceTestCaseは、S2TestCaseを継承しておりJobServiceImplのTestを行う
ためのクラスです。
・JobServiceTestCaseでtest.diconを使用(include)したいです。
・JobServiceTestCaseにJobServiceImplをDIさせたいです。
・JobServiceImplに対してMockJobDaoImplをDIさせたいです。
  また、CountryDaoを[dao.interceptor]としてDIさせたいです。
・main.diconには、mainProject配下のコンポーネント定義(AutoRegister)のみにし
たいです。

上記の内容を実現するためにtest.diconをどう最適に定義すればよいかで悩んでい
る次第です。

以下にやりたいことを簡単なJavaのソースで記述します。
[JobServiceTestCase.java]
public class JobServiceTestCase extends S2TestCase {
    public JobService service = null;

    public void testServiceTx() {
        service.doJob();
    }

    protected void setUp() {
        include("test.dicon");
    }
}

[JobServiceImpl.java]
public class JobServiceImpl implements JobService {
    private JobDao jobDao = null;
    private CountryDao countryDao = null;

    public setJobDao(JobDao jobDao) {
        this.jobDao = jobDao;
    }

    public setCountryDao(CountryDao countryDao) {
        this.countryDao = countryDao;
    }

    public void doJob() {
        jobDao.print();
        List list = countryDao.select();
    }
}

[MockJobDaoImpl.java]
public class MockJobDaoImpl implements JobDao {
    public void print() {
        _/_/_/ test用の処理を実行 _/_/_/
    }
}

[JobDaoImpl.java]
public class JobDaoImpl implements JobDao {
    public void print() {
        _/_/_/ main用の処理を実行 _/_/_/
    }
}

よろしくお願いします。

                                                - 以上 -





Seasar-user メーリングリストの案内