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に属さないやつは対象にするようになったということです。
Super Agile Struts開発記その4
http://d.hatena.ne.jp/higayasuo/20071125#1195961089
で、*.doなんてかっこ悪い。/ユースケース名/アクション名で書けるようにします。
と書いたんですが、ServletMappingを/*にするとForwardでも自分に戻ってきちゃうからだめですね。Filterだと、Forwardは自分に戻ってこないようにできるんだけど。
というわけで、ServletMappingはStrutsデフォルトのままになりました。
今日は、Actionを実行して、JSPを表示できるところまで実装しました。最初にJSPが表示されるのが遅かったので、何でだろうと思ってたら、コンパイルやってたのね(笑)。
3年くらい、HTMLテンプレートばっかりで、JSPを触ってなかったので、ちょっと新鮮。
次は、ActionFormの実装です。POJO ActionをActionFromだとStrutsに信じ込ませます。