2012-02-15 64 views
1

我想使用DefaultAdvisorAutoProxyCreator创建一个线程本地对象(带有拦截器)。我知道如何在使用ProxyFactoryObject做:如何在Spring.NET中使用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),我只得到每个线程对象的一个​​实例(正确的行为)。但是,使用第二个配置(DefaultAdvisorAutoProxyCreator),我每次都会得到一个新实例(不正确的行为;期望每个线程有一个实例)。

有什么想法?

回答

0

好吧,我发现了为什么它如预期不能正常工作。看起来很傻,我从AbstractPrototypeTargetSourceCreator.GetTargetSource()创建并返回一个新的ThreadLocalTargetSource实例。当然,ThreadLocalTargetSource的每个新实例都不会知道其“堂兄弟”之前创建的任何现有目标实例,因此每次请求实例时都会创建一个新的目标实例。

该决议非常简单。我刚刚更新了我的实现ITargetSourceCreator,以确保它创造ThreadLocalTargetSource的单个实例,并且每个AbstractPrototypeTargetSourceCreator.GetTargetSource()被调用时返回的实例:

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; 
     } 
    } 
} 

有了这个代码,它完美对我和我得到我的代理对象的线程本地生命时间。

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()方法并设置TargetObjectName和ObjectFactory的性能对我实施AbstractPrototypeTargetSourceCreator.CreatePrototypeTargetSource()方法返回的ITargetSource实例不会在ITargetSourceCreator实施是必要的。 还有其他想法吗? – ehsanullahjan 2012-02-16 05:11:26

相关问题