ひがやすを技術ブログ

電通国際情報サービスのプログラマ

S2AOPの暗黙的インタフェース対応

現在のS2AOPでは、pointcutを指定しない場合、そのクラスが実装しているインターフェースのメソッドがすべて対象になります。
インターフェースありきの開発なら、便利な仕様だと思うのですが、今後の主流になると思われる暗黙的インタフェースを使うとなると、いちいちpointcutを指定しなければいけないのが不便です。単に不便なだけではなく、pointcutを指定する場合は、メソッド名が一定のパターンで記述していなければならず、AOPのためにメソッド名に制約が入るのもおかしな感じです。
暗黙的なインターフェースの詳細はこちら
Seasar 2.4.18から、暗黙的インターフェースに対応するために、pointcutを指定しない場合、実装しているインターフェースのメソッドがないなら、Object.classに属さないpublicでfinalではないすべてのメソッドを対象にするようにしました。
今後は、基本は、暗黙的インターフェースで。多態などが必要になれば、明示的なインターフェースを抽出するという開発スタイルが、軽くっていいかなと思っています。Seasar2は、その軽快な開発スタイルを全面的にサポートします。
また、同じようなのりで、2.4.18からTxAttributeCustomizerが追加されました。このCustomizerは、トランザクション用です。
デフォルトは、Requriedのトランザクション属性になっていて、クラスに@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)をつければ、クラス全体の設定を上書きできますし、メソッドにつければ、そのメソッドだけ上書きできます。
TxAttributeCustomizerは、Object.classに属さないpublicなすべてのメソッド(合成メソッドとブリッジメソッドを除く)を対象にしています。
追記:
これまで、インターフェースありでpointcutが指定されていない場合も、インターフェースなしでpointcutが指定されている場合も、これまでと同様に動作します。
動作が変わるのは、インターフェースなしでpointcutも指定されていなかった場合で、以前は、例外になっていたところが、publicなメソッドでObject.classに属さないやつは対象にするようになったということです。