我想使用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),我每次都会得到一个新实例(不正确的行为;期望每个线程有一个实例)。
有什么想法?
添加该代码,因为AbstractPrototypeTargetSourceCreator.GetTargetSource()方法并设置TargetObjectName和ObjectFactory的性能对我实施AbstractPrototypeTargetSourceCreator.CreatePrototypeTargetSource()方法返回的ITargetSource实例不会在ITargetSourceCreator实施是必要的。 还有其他想法吗? – ehsanullahjan 2012-02-16 05:11:26