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