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

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


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

ひがです。

> 栗原です。
> 
>   話が二つなので、二分割しました。まずDAOのほう。
> 
> > 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();
> >   }
> > }
> 
>   SqletのXMLがパースされて、インターフェイスの実体を作るの
> ではなく、インターフェイスの実体はダミー実装としてユーザー
> が作るということになりますか?DBつながなくてもテストできた
> りするように、
> 
> public class EmployeeDaoImpl implements EmployeeDao {
>   public List getEmployees() {
>     List ret = new ArrayList();
>     ret.add(new EmployeeImpl("kurihara", 31));
>     ret.add(new EmployeeImpl("habu", 33));
>     return ret;
>   }
> }
> 
テストのときは、上記のようなモックを登録してテストし、
本番時(DBにアクセスするとき)は、DaoAdviceが動的に
実装を作ってしまうような感じです。
ユーザが造る必要はありません。
例えば、

public interface Hello {
  public String greeting();
}
public class HelloAdvice implements AroundAdvice {
  public Object invoke(Joinpoint joinpoint) throws Throwable {
    return "Hello";
  }
}

のようにHelloインターフェースの実装がなくても、
AroundAdvice advice = new HelloAdvice();
Aspect aspect = new AspectImpl(advice);
AopProxy aopProxy = new AopProxy(Hello.class, new Aspect[] {aspect});
Hello proxy = (Hello) aopProxy.create();
assertEquals("1", "Hello", proxy.greeting());
のようにAdviceが実装を肩代わりしてくれます。

XMLで書くと
<component class="Hello">
  <aspect>
    <component class="HelloAdvice"/>
  </aspect>
</component>
のようになります。EmployeeDaoとDaoAdviceも同じような関係です。
---
Yasuo Higa <[E-MAIL ADDRESS DELETED]>
INFORMATION SERVICES INTERNATIONAL-DENTSU,LTD.



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