[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 メーリングリストの案内