2012-01-12 8 views
4

에서 자식 상황에서 재정의 속성이 나는 특성 선언이 : 런타임에, 나는 아이 컨텍스트를 생성하고, 런타임 데이터와 그 속성을 재정의해야, 후봄 다음과 같이 부모 컨텍스트에서 실행

<bean id="my.properties" 
     class="com.rcslabs.webcall.server.property.PropertyPaceholderConfigurer"> 
     <property name="locations" value="classpath:/my.properties"/> 
</bean> 

. 그렇게하는 가장 좋은 방법은 무엇입니까?

ADDITION :

그래서
ClassPathXmlApplicationContext childAppContext = new ClassPathXmlApplicationContext(parentApplicationContext); 

, 나처럼 childAppContext에서 빈을 선언 할 수

내가 같이 런타임에 손으로 아이의 컨텍스트를 만드는거야, 더 정확하게하려면 일반적으로 BeanDefinitionRegistry를 사용하여 수행됩니까?

답변

1

PropertyPlaceholderConfigurer의 하위 클래스가있는 것 같습니다. resolveProperty을 논리 값으로 확인하고 그렇지 않은 경우 기본값으로 폴백하지 않는 이유는 무엇입니까? 하위 컨텍스트 전용 하위 클래스를 만들고 런타임 값 소스를 주입해야 할 수도 있습니다.

시스템 속성에 런타임 값을 입력하고 systemPropertiesMode에 대체 모드를 사용하면됩니다. 이것은 간단하지만 아주 깨끗한 해결책은 아니지만 제 첫 번째 접근 방식의 일부 변형이 더 좋을 것입니다. 여러 개의 클라이언트 컨텍스트를 만들면이 컨텍스트를 병렬로 생성하지 않는 한 계속 작동합니다.

업데이트 : 내가 좋아하는 뭔가 시작될 것 :

final Map<String,String> myRuntimeValues; 

ClassPathXmlApplicationContext childAppContext = new ClassPathXmlApplicationContext(parentApplicationContext) { 
    protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { 
    super.prepareBeanFactory(); 
    beanFactory.registerSingleton("myRuntimeValues", myRuntimeValues); 
    } 
}; 

및 클라이언트 컨텍스트 파일에 정의 된 PropertyPlaceholderConfigurer와 콩에 "myRuntimeValues를"주입. 더 많은 파기가 더 좋은 해결책이 될 수 있습니다. 전형적인 사용 사례는 아니며, 더 멀리 나아갈 것입니다.

+0

예, 실제로 기본 PropertyPlaceholderConfigurer의 하위 클래스를 사용하지만 ** 런타임 값을 ** 전달하는 방법은 무엇입니까? 또한, 아이 컨텍스트에 무언가를 주입하는 방법 (그리고 후에 사용하는 방법)을 아는 것은 흥미로울 것입니다. 실제로 N 개의 자식 컨텍스트가 있기 때문에 시스템 속성이 작동하지 않습니다. – weekens

+0

@weekens 업데이트 내 대답 – mrembisz

+0

좋아, 정말 좋아 보인다! 아마도 childAppContext.getBeanFactory(). registerSingleton (...)도 작동합니다 (올바른 메소드를 찾을 수 없음). 고마워요! – weekens

0

mrembisz의 대답에 대해 자세히 설명합니다. 여기에는 child xml 내부의 임의의 bean을 하드 코딩하지 않고 부모 컨텍스트에서 bean 참조를 전달하지 않고 스프링 컨텍스트에 속성을 동적으로 주입하는 완전한 예제가 있습니다. 아래의 솔루션은이 목적으로 정의되는 부모 컨텍스트가 필요하지 않습니다.

public static void main(String args[]) { 
    AbstractApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] { "classpath:spring-beans.xml" }) { 
     protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { 
      super.prepareBeanFactory(beanFactory); 
      ArrayList<Properties> prList = new ArrayList<Properties>(); 
      Properties pr = new Properties(); 
      pr.setProperty("name", "MyName"); 
      prList.add(pr); 
      Properties prArray[] = new Properties[prList.size()]; 
      PropertySourcesPlaceholderConfigurer pConfig = new PropertySourcesPlaceholderConfigurer(); 
      pConfig.setPropertiesArray(prList.toArray(prArray)); 
      beanFactory.registerSingleton("pConfig", pConfig); 
     } 
    }; 
    appContext.refresh(); 
    System.out.println(appContext.getBean("name")); 
}