좋아요, 실제로 다른 질문을했습니다. here이 질문에 대한 답을 얻은 것처럼 보입니다 (이것은 드문 경우 중 하나입니다). 다른 질문을하면, Spring.NET에서 커스텀 라이프 타임을 정의하는 것이 가능하다는 것을 알 수 있습니다.
요약하자면, ITargetSource 인터페이스를 구현하면 Spring.NET의 커스텀 라이프 타임을 생성 할 수 있습니다 만, 논리적으로는 미묘한 인터페이스이기 때문에 타겟 생성에 관한 멋진 작업을 수행하는 데 사용할 수 있습니다.
- SingletonTargetSource (싱글 수명을 제공한다)
- PrototypeTargetSource이 (과도 수명을 제공한다)
- ThreadLocalTargetSource이 (쓰레드 범위의 수명을 제공한다)
: 이미 몇 구현을 포함하여 사용 가능한 (그러나 이에 국한되지 않음)이 있습니다
- SimplePoolTargetSource는
- HotSwappableTargetSource의
을 (런타임에 목표를 교환하는 기능을 제공합니다) (개체 풀링을 제공)
흥미롭게도 개체에 평생을 적용하는 것은 원하는 평생에 따라 매우 다를 수 있습니다. Spring.NET의 모든 객체는 기본적으로 싱글 톤입니다. (사용자 정의 포함
<object id="..." type="..." singleton="false"/>
을 불행하게도 제공된 수명의 나머지 부분에 대한 이러한 편리한 속성이 없다 : 프로토 타입과 같은 객체를 (Spring.NET이 과도에 대한 이야기) 다음과 같이 당신이 싱글 = "false"로 설정을 지정하려면 구현). 따라서 스레드 로컬 범위로 객체를 구성하려고한다고 가정 해 봅시다. 위의 구성과 동일한 결과를 달성 할 경우, 다시
<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net">
<object id="ConsoleLoggingBeforeAdvisor" type="Spring.Aop.Support.DefaultPointcutAdvisor">
<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>
하지만 DefaultAdvisorAutoProxyCreator는을 사용하여, 당신은 완전히 다른 방법으로 그것을 포함해야합니다 : 여기 ProxyFactoryObject를 사용하는 것을 할 거라고 방법 ITargetSourceCreator 인터페이스를 구현하는 사용자 지정 유형을 구현합니다.
namespace Spring.Examples.AopQuickStart {
public class ThreadLocalTargetSourceCreator : AbstractPrototypeTargetSourceCreator, ITargetSourceCreator {
private readonly ThreadLocalTargetSource _threadLocalTargetSource;
public ThreadLocalTargetSourceCreator() {
_threadLocalTargetSource = new ThreadLocalTargetSource();
}
protected override AbstractPrototypeTargetSource CreatePrototypeTargetSource(Type objectType, string name, IObjectFactory factory) {
return _threadLocalTargetSource;
}
}
}
마지막으로, 당신은 스레드 로컬 범위에서 대상 유형의 인스턴스를 만들 수 DefaultAdvisorAutoProxyCreator와 함께 위의 ITargetSourceCreator를 사용하려면 다음 구성을 사용합니다 : 여기
는 ThreadLocalTargetSourceCreator를 생성 베어 뼈 ITargetSourceCreator 구현입니다 : 제 생각에는
<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net" default-autowire="constructor">
<object id="ConsoleLoggingBeforeAdvice" type="Spring.Aop.Support.DefaultPointcutAdvisor">
<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 type="Spring.Examples.AopQuickStart.ThreadLocalTargetSourceCreator"/>
</list>
</property>
</object>
</objects>
이 방법 당신은 싱글 (기본값)와 프로토 타입 이외의 수명은 어느 정도 비 직관적이고 확실히 diffe를 통해 간소화되지 않는 구성 (ProxyFactoryObject 대 DefaultAdvisorAutoProxyCreator)
요약하면, Spring.NET은 사용자 정의 수명을 지원합니다. 사전 정의 된 수명 중 어느 것도 요구 사항을 충족시키지 못하면 ITargetSource 인터페이스를 구현하고 적절하게 구성하여 사용자 정의 수명을 생성 할 수 있습니다.