2011-08-03 7 views
2

에 목록에 입력 정적 상수 변수를 사용합니까 .....어떻게 여기에 내가해야 할 일이다 나는 봄 IOC

내가 필요한 종속 서비스의 목록을 가지고

. 예를 들어, ServiceA, ServiceB 및 ServiceC로 호출 할 수 있습니다. 스프링 구성 파일에서 이러한 서비스의 순열을 정의 할 수 있어야합니다. 예를 들어 내가

<constructor-arg name="requiredServices"> 
    <list element-type="string"> 
    <value>ServiceA</value> 
    <value>ServiceB</value> 
    </list> 
</constructor-arg> 

을 가질 수 있도록이 내 문제는 내가 때 내가 차라리 것, ServiceA 및 ServiceB를 참조하는 봄 파일에 지역 문자열을 사용하고 있는지, 서비스 A와 B를 필요로 나타냅니다 ServiceA 및 ServiceB에 대한 시스템 전체 상수 이름을 사용하십시오. 그래서 내가보고 싶은 것은 같다고 생각합니다.

<constructor-arg name="requiredServices"> 
    <list element-type="string"> 
    <value>MyStringConstantsFile.ServiceA</value> 
    <value>MyStringConstantsFile.ServiceB</value> 
    </list> 
</constructor-arg> 

그런 다음 ServiceA의 이름을 바꾸면 spring.config 파일이 여전히 올바르게 작동합니다.

답변

1

문제를 두 단계로 해결해야합니다.

먼저, 사용하려는 모든 상수에 대한 항목을 스프링 구성 파일에 추가하십시오. 내 내가 네임 스페이스 CoreNamespace에 존재 ConstantsClass라는 클래스를 가지고, 그래서 CoreLibrary라는 어셈블리에서이

<object id="serverAName" 
     type="Spring.Objects.Factory.Config.FieldRetrievingFactoryObject, Spring.Core"> 
    <property name="TargetType" value="CoreNamespace.ConstantsClass, CoreLibrary"/> 
    <property name="TargetField" value="ServerAName"/> 
</object> 

것 같습니다. 나는 목록에 입력으로이 상수를 사용하려면

그럼, 단순히 Spring expression를 사용하여 스프링 설정 파일

<property name="RequiredComponents"> 
    <list element-type="string"> 
    <ref object="serverAName"/> 
    </list> 
</property> 
0

스프링이 상자를 지원하는지는 잘 모르겠지만 구성중인 개체의 코드에서 리플렉션을 사용하여 읽을 수는 있습니다.

또는 헬퍼와 같은 구문 분석기를 만들고 문자열 정의 목록을 지정하는 대신 xml 정의가 현재보다 더 자세하게 표시되지만 해당 참조 목록을 지정할 수 있습니다.

4

에 다음 행을 추가, 구성은 다음과 같이 할 수 있습니다

이이 작업을 수행하려면

:-) 질문에서 원하는 구성에 꽤 가깝게

<object id="myObject" type="q6932134.ServiceClient, q6932134"> 
    <constructor-arg name="requiredServices"> 
    <list element-type="string"> 
     <expression value="MyConstants.ServiceA" /> 
     <expression value="MyConstants.ServiceB" /> 
    </list> 
    </constructor-arg> 
</object> 

, 당신은 01,234,607을 등록해야합니까스프링 타입; 주 루틴 어딘가에 다음 코드를 입력하십시오 :

TypeRegistry.RegisterType("MyConstants", typeof(MyConstants)); 

다음 대체 구성을 사용하면 사용자 자신의 대답과 거의 같은 개체 참조를 사용할 수 있습니다.당신이 프로그래밍 방식 MyConstants를 등록하려고하지 않는 경우

<object id="svca" type="string"> 
    <constructor-arg expression="MyConstants.ServiceA" /> 
    </object> 
    <object id="svcb" type="string"> 
    <constructor-arg expression="MyConstants.ServiceB" /> 
    </object> 

    <object id="myObject" type="q6932134.ServiceClient, q6932134"> 
    <constructor-arg name="requiredServices"> 
     <list element-type="string"> 
     <ref object="svca" /> 
     <ref object="svcb" /> 
     </list> 
    </constructor-arg> 
    </object> 

, 당신은 같은 표현을 변경할 수 있습니다 :이 구성이 더 자세한 만들지 만, 구성 파일이 코드에 상수 이름을 변경에 덜 민감하게 장점이있다 다음 :

<constructor-arg expression="T(MyNamespace.MyConstants).ServiceA" /> 
+1

팁을 주셔서 감사하지만, 불행한 시나리오에있는 사람들 당신이 당신의 호출에 SPEL 구분 기호를 넣어 확인 : <생성자, 인수 값 = "# {T (MyNamespace.MyConstants를) .ServiceA를}"/ > –

관련 문제