[Seasar-user:412] Re: AOP-DAO

B isid.co.jp Yasuo Higa higa
2004年 3月 3日 (水) 15:36:29 JST


<[E-MAIL ADDRESS DELETED]> の、
   "[Seasar-user:396] Re: AOP-DAO" において、
   "Masataka Kurihara <[E-MAIL ADDRESS DELETED]>"さんは書きました:

ひがです。

> 栗原です。
> 
> > 私の考えでは、モデル(MVCのモデル)をサービス、DAO、Entityにわけ、
> > クライアントは、サービスとだけお話し、Entityをやり取りする。
> > サービスは、DAOへの参照を持ち、永続化ロジックはDAOに依頼し、
> > 業務ロジックは自分で処理する。
> 
>   さらに、同感。私もこれまでそう考えてきました。また、Seasar
> 出会う以前の一ヶ月ぐらい触ってた限りでは、SpringFrameworkもこ
> う考えているようで、DAO-ORMにはメインには既存ORMツールをおい
> て考えていると、作りやドキュメントより感じられます。
>   しか〜し、別スレッドのひがさんのマイルストーンにあった、
> 
> > DAO:データの永続処理をAOPで提供。もとのSqlet
> 
> というので「なに!IoCコンテナ使うというだけでなくAOP?」と思い、
> 
> >  <aspect>
> >    <component class="org.seasar.framework.dao.advices.DaoAdvice">
> >      <!-- DataSourceコンポーネントの名前。他で定義済み -->
> >      <arg>jdbc/default</arg>
> >      <!-- XMLのリソースパス -->
> >      <arg>'hoge/dao/EmployeeDao.xml'</arg>
> >    </component>
> >  </aspect>
> 
>   うぉ、ほんとにAdviceで(狭い意味のAOPで)実装するのか〜と。Advice
> で実装するからには、aspectタグの設定およびAroundAdviceを実装しなけれ
> ばならないのでしょうが、DaoAdvice で実装する内容が Advice である必要
> 性が見つからないのです。POJO・Type2&3 IoCコンテナですから、作法は無
> いに越したことはないわけで、IoCコンテナで使われるというだけの縛りで
> POJO‐DAO-ORMなコンポーネントとして、独立に新Sqletワールドが広がった
> ほうがシンプルで、たとえばSpringFrameworkなどの中ででもSqletが使える。
> 
S2DaoでAOPを使う本質的な意味は実はありません。DaoAdviceの中身も
private S2Dao dao_;
public DaoAdivice(DataSource ds, String path) {
  dao_ = new S2DaoImpl(ds, path);
}
public Object invoke(Joinpoint joinpoint) throws Throwable {
  String methodName = joinpoint.getMethod().getName();
  Query query = dao_.getQuery(methodName);
  if (query != null) {
    return query.invoke(jointpoint.getArgs());
  } else {
    return joinpoint.proceed();
  }
}
するだけのものです。
SpringでHibernateを使ったサンプルって、
public List getVets() throws DataAccessException {
  return getHibernateTemplate().find("from Vet vet order by vet.lastName, vet.firstName");
}
のように単に(1Line)ラッパーになってるじゃないですか。
このような無意味(?)なラッパーを作らなくてもいいようにAOPを
利用しようと考えたわけです。
> 
>   さて、ここからAOP-DAOでなく、ひがさんに振ってもらったXMLのほうの話。
> 
> > aspectタグについては、通常だと<aspect>アドバイス名</aspect>
> > だけですみます。アドバイスを直接埋め込む場合は、
> > argタグやpropertyタグと同じように子タグにcomponentタグを
> > 使ったほうが統一がとれてて良いかなと思ってます。
> 
>   なるほど、OK。統一は学習効果上も大事だと思います。日記の記事を見
> ましたが、Pointcutを指定する場合は、以下の感じですか?
> 
>    <aspect>
>      <component class="Foo.BarAdvice">
>        <arg>Boo</arg>
>        <arg>checkera</arg>
>      </component>
>      <pointcut method="calcSalary"/>
>    </aspect>

<aspect pointcut="calcSalary">
  <component class="Foo.BarAdvice">
    <arg>Boo</arg>
    <arg>checkera</arg>
  </component>
</aspect>
です。要素と属性の違いだけですが。
pointcutが複数ある場合にはpointcut="foo, bar"となります。
pointcutを指定しない場合は、aspectの親タグのコンポーネントのクラスが
実装しているインターフェースのすべてのメソッドが対象になります。
pointcutを指定しない場合が大半だろうと予想してます。

最新のS2Containerのマニュアルを添付しておきます。

> > と書いていて、まだ、XMLでの設定機能はリリースしてないことを
> > 思い出しました。
> 
>   はやくっ、はやく(^^)/

よっしゃ。今週末、S2-EA2をリリースするぜよ。
---
Yasuo Higa <[E-MAIL ADDRESS DELETED]>
INFORMATION SERVICES INTERNATIONAL-DENTSU,LTD.
-------------- next part --------------
HTMLの添付ファイルを取り除きました.
URL: http://lists.sourceforge.jp/mailman/archives/seasar-user/attachments/20040303/c3af165b/IoCContainer-0001.html



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