give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

Spring.NETのSdkRegularExpressionMethodPointcutの使い方でハマったところ

Spring.NETのSdkRegularExpressionMethodPointcutの使い方でハマったところをメモしておきます。


Spring.NETのマニュアル

<object id="serviceOperation" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop">
    <property name="pattern" value="Spring.TxQuickStart.Services.*"/>
</object>


と書いてあったので、これを真似して"pattern"のところに自分の作ったネームスペース.クラス名を書いてみましたが、うまくAOPが機能しませんでした。


自分の書いたXMLファイル

<!-- MyClassの全メソッドにAOPを仕掛けたい -->
<object id="serviceOperation" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop">
    <property name="pattern" value="MyNamespace.MyClass.*"/>
</object>


そこでSpringの実装コードを確認してみるとMatchesメソッドでログを吐いているようなので、ログを確認したところ、以下のようなログが残っていました。


ログの出力結果

Candidate is: 'CompositionAopProxy_64c40cb2950d4f55ab743bd512f98fce.UpdateHoge'; pattern is 'MyNamespace.MyClass.*'; matched=False


実は自分の作ったクラスは別の場所で他のAOPを仕掛けてあったので、実装クラスではなくProxyクラスのクラス名とpatternが比較されていたのでした。


ネームスペース名やクラス名でマッチさせるのは難しそうだったので、やむを得ずメソッド名だけで識別できるようにパターンを変更しました。

<object id="serviceOperation" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop">
    <property name="pattern" value="\.Update.*"/>
</object>


ログがなかったら今でもずっと試行錯誤してたんじゃないかと思います。おそらく。。。