Spring AOP と AspectJ を使用して Aspect を作成しようとしています。
@Aspect(value = "perthis(execution(* x.y.z.command.Command.execute()))")
public class CommandAdvice {
// Advices....
}
'value 属性の Javadoc には次のように書かれています。
Per clause expression, defaults to singleton aspect.
Valid values are "" (singleton), "perthis(...)", etc
@Aspect アノテーションで 'value' 属性を指定しなくても、すべてが機能します。
上記の perthis 設定を使用すると、次の例外が発生しました:-
Caused by: java.lang.IllegalArgumentException: Bean with name 'commandAspect' is a singleton, but aspect instantiation model is not singleton.
そこで、アドバイス Bean のスコープをプロトタイプに変更してみました:-
<bean id="commandAspect" class="x.y.z.command.CommandAdvice" **scope="prototype"**
factory-method="aspectOf" />
これにより、次の結果が得られました:-
Caused by: java.lang.IllegalArgumentException: Can not set x.y.z.command.Command field x.y.z.test.CommandTest.command to sun.proxy.$Proxy30
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63)
at java.lang.reflect.Field.set(Field.java:657)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:502)
私の要件は、「プロトタイプ」スコープの Aspect Bean を作成することです。
プロトタイプ Aspect Bean はお勧めですか? マルチスレッド環境の長所と短所は何ですか?
その「値」属性を使用してそれを行う方法は?