DefaultAdvisorAutoProxyCreatorを使用してスレッドローカルオブジェクト(インターセプタを使用)を作成したいとします。私はProxyFactoryObject使用していることを行う方法を知っている:SpringAdvisorでDefaultAdvisorAutoProxyCreatorでスレッドスコープのオブジェクトを定義する方法
<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net">
<object id="ConsoleLoggingBeforeAdvisor" type="Spring.Aop.Support.DefaultPointcutAdvisor" singleton="false">
<property name="Advice">
<object type="Spring.Examples.AopQuickStart.ConsoleLoggingBeforeAdvice"/>
</property>
</object>
<object id="ServiceCommandTargetSource" type="Spring.Aop.Target.ThreadLocalTargetSource">
<property name="TargetObjectName" value="ServiceCommandTarget"/>
</object>
<object id="ServiceCommandTarget" type="Spring.Examples.AopQuickStart.ServiceCommand" singleton="false"/>
<object name="ServiceCommand" type="Spring.Aop.Framework.ProxyFactoryObject">
<property name="TargetSource" ref="ServiceCommandTargetSource"/>
<property name="InterceptorNames">
<list>
<value>ConsoleLoggingBeforeAdvisor</value>
</list>
</property>
</object>
</objects>
は、しかし、私はDefaultAdvisorAopCreatorを使用して同じ効果を取得する方法を知りません。ここで私は試してみました(しかし、うまくいきませんでした)何:
<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net">
<object id="ConsoleLoggingBeforeAdvisor" type="Spring.Aop.Support.DefaultPointcutAdvisor" singleton="false">
<property name="Advice">
<object type="Spring.Examples.AopQuickStart.ConsoleLoggingBeforeAdvice"/>
</property>
</object>
<object id="ServiceCommand" type="Spring.Examples.AopQuickStart.ServiceCommand" singleton="false"/>
<object type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator">
<property name="CustomTargetSourceCreators">
<list element-type="Spring.Aop.Framework.AutoProxy.ITargetSourceCreator">
<object id="ThreadLocalTargetSourceCreator" type="Spring.Examples.AopQuickStart.ThreadLocalTargetSourceCreator"/>
</list>
</property>
</object>
</objects>
ThreadLocalTargetSourceCreatorは無条件ThreadLocalTargetSourceインスタンスを返すカスタムクラスです:
namespace Spring.Examples.AopQuickStart {
public class ThreadLocalTargetSourceCreator : AbstractPrototypeTargetSourceCreator {
protected override AbstractPrototypeTargetSource CreatePrototypeTargetSource(Type objectType, string name, IObjectFactory factory) {
return new ThreadLocalTargetSource();
}
}
}
ので、要約すると、私は春からServiceCommandを要求します。 NETを最初の設定(ProxyFactoryObjectを使用)で実行すると、スレッドごとにオブジェクトのインスタンスが1つしか得られません(正しい動作)。しかし、2番目のconfig(DefaultAdvisorAutoProxyCreator)では、毎回新しいインスタンスが得られます(不正な動作、スレッドごとに1つのインスタンスが必要です)。
どのような考えですか?テストされていない
AbstractPrototypeTargetSourceCreator.GetTargetSource()メソッドは、AbstractPrototypeTargetSourceCreator.CreatePrototypeTargetSource()メソッドを実装して返されたITargetSourceインスタンスのTargetObjectNameおよびObjectFactoryプロパティを設定するため、このコードをITargetSourceCreator実装に追加する必要はありません。 他の考えはありますか? – ehsanullahjan