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