[Seasar-user:6170] Re: AspectAutoRegister を cooldeploy で記述するには
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2007年 2月 14日 (水) 18:00:27 JST
小林 (koichik) です.
Date: Wed, 14 Feb 2007 16:26:27 +0900
From: "o.h." <[E-MAIL ADDRESS DELETED]>
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:6166] AspectAutoRegister を cooldeploy で記述するには
> で、従来 AnnotationAspectAutoRegister や InterfaceAspectAutoRegister
> を使って自動登録していた部分を記述する方法がわかりません.
>
> やりたいことは、Action に特定のインターフェースまたはアノテーション
> が付いている場合に限り Aspect を適用ということなのですが.
現状だと,従来のままのやり方はありません.
SMART deploy としては,コンポーネントのクラスに
アノテーションで指定することになります.
@Aspect("xxxInterceptor")
public class HogeServiceImpl implements HogeService {
...
}
独自のアノテーションを作成することもできます.
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.TYPE, ElementType.METHOD })
@Interceptor
public @interface Xxx {
String pointcut() default "";
}
というアノテーションを作成して
@Xxx
public class HogeServiceImpl implements HogeService {
...
}
この場合,クラス名をデキャピタライズした後ろに Interceptor を
付けたもの (xxxInterceptor) がインターセプタのコンポーネント名に
なります.これを変更するには @Interceptor でインターセプタの
コンポーネント名を指定します.
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.TYPE, ElementType.METHOD })
@Interceptor("hogeInterceptor")
public @interface Xxx {
String pointcut() default "";
}
とします.
あるいは EJB3 のアノテーションを使って
@Stateless
@Interceptors(XxxInterceptor.class)
public class HogeServiceImpl implements HogeService {
...
}
この場合のインターセプタは Seasar2 (AOP アライアンス)
のものではなく,EJB3 のものになります.
いずれの場合も,アノテーションをインタフェースに付けても
効果がありません.実装クラスに付ける必要があります.
また,最初の @Aspect アノテーションはスーパークラスに
付けても効果がなく,末端のクラスに付ける必要があります.
独自アノテーションの場合は,独自のアノテーションに
@Inherited を付けることで,スーパークラスに付けた
アノテーションが有効になります.
どのアノテーションも,クラスだけでなくメソッドに
指定することもできます.
--
<component name="koichik">
<property name="fullName">"Koichi Kobayashi"</property>
<property name="email">"[E-MAIL ADDRESS DELETED]"</property>
<property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>
Seasar-user メーリングリストの案内