2012-02-12 2 views
0

내가 Spring.NET 새로운 오전 그냥 다른 일을 시도 장난 오전에 DefaultAdvisorAutoProxyCreator와 함께 프로토 타입의 인터셉터를 정의하는 방법. 마지막으로 다음과 같이Spring.NET

public class ServiceCommand : ICommand { 
    public ServiceCommand() { 
     Console.WriteLine("########## {0} ##########", GetType().Name); 
    } 

    public void Execute(object context) { 
     Console.WriteLine("Service implementation: {0}.{1}", GetType().Name, MethodBase.GetCurrentMethod().Name); 
    } 
} 

, 내가 조언을하기 전에 간단한을했습니다 :

public class ConsoleLoggingBeforeAdvice : IMethodBeforeAdvice { 
    public ConsoleLoggingBeforeAdvice() { 
     Console.WriteLine("########## {0} ##########", GetType().Name); 
    } 

    public void Before(MethodInfo method, object[] args, object target) { 
     Console.WriteLine("Intercepted call to this method: {0}", method.Name); 
     Console.WriteLine("  The target is    : {0}", target); 
     Console.WriteLine("  The arguments are   : "); 
     if (args != null) { 
      foreach (object arg in args) { 
       Console.WriteLine("\t: {0}", arg); 
      } 
     } 
    } 
} 

으로 하나의 구현

public interface ICommand { 
    void Execute(object context); 
} 

: 내 테스트의 일환으로, 나는 간단한 객체를 생성 당신은 볼 수 있습니다,이 물건의 대부분은 Spring.NET 빠른 시작 샘플입니다.

그래서, ProxyFactoryObject 통해 ConsoleLoggingBeforeAdvice 래핑 할 ServiceCommand 구성 및 프로토 타입 모두 객체 (이하의 구성을 참조)로 표시. 예상대로이 작동 : 우리는 ServiceCommand, 객체 모두의 새로운 인스턴스 및 관련 인터셉터를 요청할 때마다 생성됩니다 그러나

<?xml version="1.0" encoding="utf-8"?> 
<objects xmlns="http://www.springframework.net"> 
    <object id="ConsoleLoggingBeforeAdvice" type="Spring.Aop.Support.DefaultPointcutAdvisor" singleton="false"> 
     <property name="Advice"> 
      <object type="Spring.Examples.AopQuickStart.ConsoleLoggingBeforeAdvice"/> 
     </property> 
    </object> 

    <object id="ServiceCommandTarget" type="Spring.Examples.AopQuickStart.ServiceCommand" singleton="false"/> 

    <object id="ServiceCommand" type ="Spring.Aop.Framework.ProxyFactoryObject"> 
     <property name="IsSingleton" value="false"/> 
     <property name="TargetName" value="ServiceCommandTarget"/> 
     <property name="InterceptorNames"> 
      <list> 
       <value>ConsoleLoggingBeforeAdvice</value> 
      </list> 
     </property> 
    </object> 
</objects> 

, 내가 DefaultAdvisorAutoProxyCreator와를 통해 동일한 결과를 달성하려고 할 때, 모든 것을 제외하고 작동 인터셉터는 항상 싱글 톤으로 생성됩니다 (싱글 톤 = "false"로 설정되어 있음에도 불구하고).

이제
<?xml version="1.0" encoding="utf-8"?> 
<objects xmlns="http://www.springframework.net"> 
    <object id="ConsoleLoggingBeforeAdvice" 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"/> 
</objects> 

, 어떻게 그 객체와 연관 인터셉터 모두 DefaultAdvisorAutoProxyCreator는에 의해 프로토 타입으로 처리됩니다 보장 할 수 있습니다 : 다음과 같이 설정은? (그들이 그렇게 구성된 경우)

+0

이 질문은 [스프링 포럼] (http://forum.springframework.net/showthread.php?9977-Using-Prototype-Interceptors-with-DefaultAdvisorAutoProxyCreator&p=29004#post29004)에도 게시되었습니다. – Marijn

+0

예, 그렇습니다. 거기에 게시 한 사람이지만 그 질문에는 설정 문제가 있었는데 나중에 내가 해결했다 (그리고 게시물을 업데이트했다). 따라서 misconfig 문제로 인해 프로토 타입이 쓰레드 범위에서 생성되는 것과 같은 문제가 발생했습니다. 그러나 DefaultAdvisorAutoProxyCreator에 의해 항상 싱글 톤으로 생성되는 인터셉터의 주요 쟁점은 여전히 ​​열려 있습니다. – ehsanullahjan

답변

1

OK, 나는 DefaultAdvisorAutoProxyCreator는에 설정 인터셉터가 제대로 프로토 타입 인터셉터의 인스턴스 것을 알아 냈어요. 그러나 DefaultAdvisorAutoProxyCreator가 권고 자의 인터셉터를 선택하고 구성 설정을 존중할 수 있어야하므로 잘못된 것으로 느껴집니다.

나는 아직도 다른 scenrarios에서 프로토 타입 인터셉터를 만드는 방법에 대한 100 % 명확입니다. 예를 들어 DefaultAdvisorAutoProxyCreator를 사용하는 동안 스레드 범위 인터셉터를 만드는 모든 시도가 실패했습니다.

어쨌든, 여기에 나를 위해 작동하는 XML 설정입니다 :

<?xml version="1.0" encoding="utf-8"?> 
<objects xmlns="http://www.springframework.net" default-autowire="constructor"> 
    <object id="ConsoleLoggingBeforeAdvice" 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="InterceptorNames" value="ConsoleLoggingBeforeAdvice"/> 
    </object> 
</objects> 

나는 프로토 타입 인터셉터를 만드는 아이디어와 완전히 혼란 스러워요. 요격기는 프로토 타입이 될 것인가 또는 권장 되는가 아니면 항상 싱글 톤이어야 하는가?