2012-03-27 2 views
2

ClassPathXMLApplicationContext에서 다른 콩으로 콩을 옮기는 방법은 무엇입니까?java : Spring : 한 ClassPathXMLApplicationContext에서 다른 ClassPathXMLApplicationContext로 Bean을 전송하는 방법은 무엇입니까?

나는 myOneContextmy2ndContext 모든 콩을 전송하기 위해이

ClassPathXMLApplicationContext myOneContext = new ClassPathXMLApplicationContext("path to my xml bean definitions"); // It loads 10 beans which probably refer each other 

ClassPathXMLApplicationContext my2ndContext = new ClassPathXMLApplicationContext("path to my xml bean definitions"); // It loads 2 beans, which probably refer each other 

같은 하나의 맥락이 가능하다을 만들?

내가 myOneContext에서의 BeanFactory를 받고 DefaultSingletonBeanRegistry로 내부 빈 공장을 얻고 호출 된 registerSingleton

Object beanObject = my2ndContext.getBean("beanName"); 
DefaultSingletonBeanRegistry lbf =(DefaultSingletonBeanRegistry)myOneContext.getBeanFactory(); 
lbf.registerSingleton("beanName", beanObject); 

이 괜찮습니다? 나는 내가 일종의 해킹을하고 있다고 느낍니다. 또한 내가 무엇을 놓치고 있는지 확실하지 않습니다.

다른 옵션은 동일한 컨텍스트에서 빈을 유지하고 AppContext와 빈 팩토리간에 상위 관계를 추가하는 것입니다.

myOneContext.setParent(my2ndContext); 
DefaultListableBeanFactory lbf = (DefaultListableBeanFactory)myOneContext.getBeanFactory(); 
lbf.setParentBeanFactory(my2ndContext.getBeanFactory()); 

모두 상황에서 모든 콩이 myOneContext

에서 볼 수 있습니다하지만 난이 my2ndContext을 파괴해야하고 내가 BeanFactory에의 부모가 null로 설정하면 문제가 발생한다 이런 식으로.

DefaultListableBeanFactory lbf = (DefaultListableBeanFactory)myOneContext.getBeanFactory(); 
lbf.setParentBeanFactory(null); <<< throws exception 

왜냐하면 bean 팩토리를 변경할 수 없기 때문입니다.

From Spring Sourse: AbstractBeanFactory.java 
public void setParentBeanFactory(BeanFactory parentBeanFactory) { 
    if (this.parentBeanFactory != null && this.parentBeanFactory != parentBeanFactory) { 
     throw new IllegalStateException("Already associated with parent BeanFactory: " + this.parentBeanFactory); 
    } 
    this.parentBeanFactory = parentBeanFactory; 
} 

내가 방법을 선택해야 ? 콩을 옮기거나 부모 관계를 만드십시오. 어느 쪽이 좋습니까?

감사합니다,

감사합니다,

비멀

+0

왜 두 개의 별도 컨텍스트가 필요합니까? 그들은 독립적으로 새롭게해야합니까? 상호 종속성이 있습니까? 죄송합니다. 많은 질문을 던지고 있지만 큰 그림을 여기에서 보지 못하고 유용하지 않으면 유용하지 않습니다. – mrembisz

+0

@mrembisz 예, 독립적으로 새로 고쳐야합니다. 첫 번째 컨텍스트는 시작시 채워지 며 일반적으로 일부 인프라 빈을 포함합니다. 두 번째 컨텍스트는 실행중인 프로세스에 '응용 프로그램 pkg'을 배포 할 때 동적으로 만들어집니다. 패키지에는 동적으로로드해야하는 Bean 정의가 들어 있습니다. 나중에 언로드/업그레이드 할 수 있습니다. 따라서 어떤 의미에서 첫 번째 앱 컨텍스트는 플랫폼이며 두 번째 컨텍스트에는 그 애플리케이션이 포함되어 있습니다.이 애플리케이션은 핫 배포, 배포 취소 될 수 있습니다.이 설명에서 – weima

+0

내가 한 번 시작시 내장되어 "플랫폼"컨텍스트를 가질 것이다. 필요할 때마다 새로 고침하거나 다시 작성할 수있는 "동적"컨텍스트의 부모가됩니다. 이것은 "동적"컨텍스트를 새로 고칠 필요가 있다고 가정합니다. "플랫폼"컨텍스트를 새로 고쳐야한다면, 내가 생각하기에 상쾌하게 될 것입니다. 여기서 부모 컨텍스트를 전환 할 필요는 없습니다. – mrembisz

답변

3

나는 내부의 모든 공유 인프라와 전용 부모 컨텍스트를 설정하는 것이 좋습니다. 응용 프로그램 특정 컨텍스트는이 컨텍스트를 부모로 사용합니다. 부모의 공유 부분을 그대로두고 동적 컨텍스트를 새로 고치는 것이 가능합니다.

상위 - 하위 계층을 하나의 상위 컨텍스트와 여러 하위 컨텍스트로 유지하는 것이 가장 좋습니다. 먼저 유혹하는 동안 형제 응용 프로그램 컨텍스트 간의 상호 종속성은 나중에 혼란에 기여할 것이며 그러한 종속성을 지원하려면 간단한 해킹이나 해결 방법이 필요합니다.

이런 종류의 형제 종속성이 필수라면 OSGI를 살펴보십시오.

+0

덕분에 많은 것을 선택합니다 :) – weima

관련 문제