2012-02-15 8 views
1

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つのインスタンスが必要です)。

どのような考えですか?テストされていない

答えて

0

[OK]を、私が見つけました。愚かなように、私はAbstractPrototypeTargetSourceCreator.GetTargetSource()からThreadLocalTargetSourceの新しいインスタンスを作成して返していました。もちろん、ThreadLocalTargetSourceの新しいインスタンスは、以前の "いとこ"によって作成された既存のターゲットインスタンスの手がかりを持たないため、インスタンスが要求されるたびにそのターゲットの新しいインスタンスが作成されます。

解像度は非常に簡単でした。このコードでは

namespace Spring.Examples.AopQuickStart { 
    public class ThreadLocalTargetSourceCreator : AbstractPrototypeTargetSourceCreator { 
     private readonly ThreadLocalTargetSource _threadLocalTargetSource; 

     public ThreadLocalTargetSourceCreator() { 
      _threadLocalTargetSource = new ThreadLocalTargetSource(); 
     } 

     protected override AbstractPrototypeTargetSource CreatePrototypeTargetSource(Type objectType, string name, IObjectFactory factory) { 
      return _threadLocalTargetSource; 
     } 
    } 
} 

、それは私のために完璧に動作し、私が手に:私はちょうどそれがThreadLocalTargetSourceの単一のインスタンスを作成し、そのインスタンスにAbstractPrototypeTargetSourceCreator.GetTargetSource()が呼び出されたたびに返されたことを確認するITargetSourceCreatorの私の実装を更新しますプロキシされたオブジェクトのスレッドローカルの存続時間。

0

が、これを試してみてください(またはそのような何か):予想通り、それは働いていなかった理由を

protected override AbstractPrototypeTargetSource CreatePrototypeTargetSource(Type objectType, string name, IObjectFactory factory) { 
    ThreadLocalTargetSource ts = new ThreadLocalTargetSource(); 
    ts.TargetObjectName = name; 
    ts.ObjectFactory = factory; 
    return ts; 
} 
+0

AbstractPrototypeTargetSourceCreator.GetTargetSource()メソッドは、AbstractPrototypeTargetSourceCreator.CreatePrototypeTargetSource()メソッドを実装して返されたITargetSourceインスタンスのTargetObjectNameおよびObjectFactoryプロパティを設定するため、このコードをITargetSourceCreator実装に追加する必要はありません。 他の考えはありますか? – ehsanullahjan