ClassPathXMLApplicationContext
에서 다른 콩으로 콩을 옮기는 방법은 무엇입니까?java : Spring : 한 ClassPathXMLApplicationContext에서 다른 ClassPathXMLApplicationContext로 Bean을 전송하는 방법은 무엇입니까?
나는 myOneContext
에 my2ndContext
모든 콩을 전송하기 위해이
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;
}
내가 방법을 선택해야 ? 콩을 옮기거나 부모 관계를 만드십시오. 어느 쪽이 좋습니까?
감사합니다,
감사합니다,
비멀
왜 두 개의 별도 컨텍스트가 필요합니까? 그들은 독립적으로 새롭게해야합니까? 상호 종속성이 있습니까? 죄송합니다. 많은 질문을 던지고 있지만 큰 그림을 여기에서 보지 못하고 유용하지 않으면 유용하지 않습니다. – mrembisz
@mrembisz 예, 독립적으로 새로 고쳐야합니다. 첫 번째 컨텍스트는 시작시 채워지 며 일반적으로 일부 인프라 빈을 포함합니다. 두 번째 컨텍스트는 실행중인 프로세스에 '응용 프로그램 pkg'을 배포 할 때 동적으로 만들어집니다. 패키지에는 동적으로로드해야하는 Bean 정의가 들어 있습니다. 나중에 언로드/업그레이드 할 수 있습니다. 따라서 어떤 의미에서 첫 번째 앱 컨텍스트는 플랫폼이며 두 번째 컨텍스트에는 그 애플리케이션이 포함되어 있습니다.이 애플리케이션은 핫 배포, 배포 취소 될 수 있습니다.이 설명에서 – weima
내가 한 번 시작시 내장되어 "플랫폼"컨텍스트를 가질 것이다. 필요할 때마다 새로 고침하거나 다시 작성할 수있는 "동적"컨텍스트의 부모가됩니다. 이것은 "동적"컨텍스트를 새로 고칠 필요가 있다고 가정합니다. "플랫폼"컨텍스트를 새로 고쳐야한다면, 내가 생각하기에 상쾌하게 될 것입니다. 여기서 부모 컨텍스트를 전환 할 필요는 없습니다. – mrembisz