1. 無料アクセス解析

crossroad's Blog

Javaを中心にした技術ネタなど。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

S2AOPのアスペクトの自動ウィービングでの注意点

S2AOPでコンポーネントにアスペクト使用する場合、ポイントカットを明示的にしていないと以下のルールでウィービングされる。
ひがやすを blog / S2AOPの暗黙的インタフェース対応、および S2 DIContainer のタグリファレンス の「pointcut属性」参照)

 a.コンポーネントがインターフェースを実装していない場合は、Objectクラスで定義されている
  メソッドを除く、全ての非finalなpublicメソッド。

 b.コンポーネントがインターフェースを実装している場合は、インターフェースで定義されている全てのメソッド。


この b. が意外と落とし穴で、インターフェースを実装すると、インターフェースで定義されていないメソッドにはアスペクトがウィービングされなくなる


public interface IExample {

public void method1();

}

public class ExampleService implements IExample{

/* インターフェースで定義されているので、アスペクトがウィービングされる */
public void method1() {
:
}

/* インターフェースで定義されていないので、アスペクトがウィービングされない */
public void method2() {
:
}
}



対処として考えられるのは以下の3パターン。

1.一切インターフェースを実装しないようにする(暗黙的インターフェースだけを使う)
  前述 a. の通り、インターフェースを実装しなければS2AOPがよろしくやってくれるので、
  S2コンテナでコンポーネント管理するクラスには、一切インターフェースを実装しないルールにする。

2.逆に、全ての公開メソッドをインターフェースで定義する(明示的インターフェースだけを使う)
  前述 b. の通り、インターフェースを実装するとインターフェースで定義されているメソッドだけが
  ウィービング対象になるので、S2コンテナでコンポーネント管理するクラスの公開メソッドは
  全てインターフェースで定義する。

3.ポイントカットを明示的に指定する
  diconでポイントカットを明示的に指定すれば、前述の例の method2() にもアスペクトをウィービングできる。

  ただし、ポイントカットを ".*" のように指定してしまうと、finalなメソッドまでウィービング対象となってしまうため、
  「Xxxxxxのメソッド(xxxx)にはアスペクトを適用できない修飾子が指定されています」のようなWARNログが出てしまう。
  警告なので無視しても構わないが、大量にWARNログが出るので気持ち悪い感がある..

4.独自のAspectCustomizer・Pointcutを作る
  AspectCustomizerを継承して #createPointcut() をオーバーライドし、独自のPointcutを返すようにする。
  Pointcutでは、final なメソッドかどうかを判断(Method#getModifiers())してfinalであればウィービングしないようにする。
  一番理想的な対応と思うが、S2標準のdiconの書き方ができなくなる。


S2の思想や、実装量を極力減らして生産性を上げることを考えると、パターン1.が一番良いと言うことになるかな。

ただ、複数のクラスで共通の公開メソッドを規定したい場合にインターフェースが使えないのは結構痛い。
インターフェースではなく継承でと言う方法もあるが、Javaは多重継承できないし、あまり継承で面倒なことにはなりたくない。

まぁ、共通の公開メソッドを規定したいと言うケースはあまりないだろう、と言うことで。



関連記事
スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2011/12/15(木) 12:03:22|
  2. ソフトウェア開発 Seasar
  3. | トラックバック:0
  4. | コメント:0
<<12/15のツイートまとめ | ホーム | 12/14のツイートまとめ>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://bagineer.blog59.fc2.com/tb.php/280-f5c567e8
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

crossroad

Author:crossroad
関西在住。男。
フリーランスのソフトウェアエンジニア。
エレキベース(Rock&Roll)とお酒が好物でございます。

カテゴリー

タグリスト

Java F1 フリーランス ベーシスト HARRY TheStreetSliders iPhone FX お酒 Seasar Maven eclipse Wicket マイホーム 野球 プロジェクトファシリテーション Rails Ruby UML お店 ソフトウェア Tomcat S2Flex2 jsf Teeda Eclipse タグライブラリ ajax タスク europa mylyn trac 

ブログ内検索

最近の記事

最近のコメント

最近のトラックバック

カレンダー

03 | 2017/04 | 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -

月別アーカイブ

全ての記事を表示する

全ての記事を表示する

Twitter


RSSフィード

リンク

このブログをリンクに追加する

アクセスカウンタ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。