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)에서는 매번 새로운 인스턴스가 생성됩니다 (잘못된 동작, 스레드 당 하나의 인스턴스가 필요함).
의견이 있으십니까?
AbstractPrototypeTargetSourceCreator.GetTargetSource() 메서드가 AbstractPrototypeTargetSourceCreator.CreatePrototypeTargetSource() 메서드를 구현하여 반환 된 ITargetSource 인스턴스의 TargetObjectName 및 ObjectFactory 속성을 설정하기 때문에 ITargetSourceCreator 구현에이 코드를 추가 할 필요가 없습니다. 다른 의견은 있습니까? – ehsanullahjan