2012-02-15 6 views
1

DefaultAdvisorAutoProxyCreator를 사용하여 스레드 로컬 객체 (인터셉터 포함)를 만들고 싶습니다. 나는 ProxyFactoryObject 사용하여 그렇게하는 방법을 알고 :Spring.NET에서 DefaultAdvisorAutoProxyCreator를 사용하여 Thread-scoped 객체를 정의하는 방법

<?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 사용), 나는 스레드 당 하나의 인스턴스 (올바른 동작) 얻을. 그러나 두 번째 config (DefaultAdvisorAutoProxyCreator)에서는 매번 새로운 인스턴스가 생성됩니다 (잘못된 동작, 스레드 당 하나의 인스턴스가 필요함).

의견이 있으십니까?

답변

0

좋아, 나는 발견했다. 어리석은 것처럼, 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