2012-02-02 3 views
4

우리는 포틀릿을 포함하는 포털과 같은 여러 구성 요소 (위젯)를 포함하는 홈페이지를 가지고 있습니다. 위젯 중 일부는 다른 팀의 광고 항아리로 전달되며 일부는 봄에 의해 관리되는 맞춤 콩을 필요로합니다. 하나의 해결책은 I 와일드 카드로 import 문을 사용하여 스프링 컨텍스트를 가져 오는 것입니다 (예 : 컨텍스트 위젯 - *. xml과 일치하는 클래스 경로의 모든 컨텍스트 가져 오기).Spring은 런타임에 외부 스프링 컨텍스트를 추가합니다.

그러나, 나는 그들이 (클래스 패스에서)로드해야 할 상황에 맞는 각각의 위젯을 확인보다 프로그래밍 솔루션을 선호합니다. 나는 이것에 대해 설명하는 어떤 블로그도 찾지 못했지만 포럼에서 이것이 부모 - 자식 컨텍스트 일 ​​것이고 이것이 단방향 일 것이라고 설명하는 게시물을 찾았습니다. 불행히도 내 경우에는 양방향이어야합니다.

는 그래서 API의 일부 검색 후 나는 일하는 것을 생각해 관리하지만 난 그게 좋은 해결책 또는 그것이 내가 생각하지 않았다 어떤 함정이 있습니다 확신하지 않다. 아마도이 시나리오를위한 또 다른 (더 나은) 솔루션이 있을까요?

public class WidgetManager implements ApplicationContextAware 
{ 

    @Autowired 
    private WidgetService widgetService; 

    @Override 
    public void setApplicationContext(ApplicationContext parentApplicationContext) throws BeansException { 
     //I do need the parent context to have finished initializing beans 
     List<WidgetTO> widgets = widgetService.findAllWidgets(); 

     List<String> contexts = newArrayListWithCapacity(widgets.size()); 
     for (WidgetTO widget : widgets) { 
      if (isNotBlank(widget.getSpringContext())) { 
       contexts.add(widget.getSpringContext()); 
      } 
     } 

     AbstractRefreshableWebApplicationContext parentContext = (AbstractRefreshableWebApplicationContext) parentApplicationContext; 

     ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(contexts.toArray(new String[] {}), parentApplicationContext); 
     String[] singletonNames = context.getBeanFactory().getSingletonNames(); 
     for (String s : singletonNames) { 
      //copy all singletons that don't already exist from child to parent 
      if (!parentContext.getBeanFactory().containsSingleton(s)) { 
       parentContext.getBeanFactory().registerSingleton(s, context.getBeanFactory().getSingleton(s)); 
      } 
     } 

    } 
} 
+0

왜 부모 콩에서 액세스 할 수있는 콩이 필요한지 언급하지 않았습니다. 어쩌면 양방향 일 필요는 없습니까? 충돌 및 기타 예기치 않은 결과가 발생할 수 있습니다. – mrembisz

+0

좋은 점은 실제로는 개찰구 응용 프로그램입니다 (언급 했어야 함). 홈페이지는 개찰구 웹 페이지이며 창 부품 위젯 패널 (반영에 의해 초기화 됨)입니다. 위젯 패널을 만들 때 Bean (하위 컨텍스트 xml에 정의 됨)은 Wicket (@SpringBean)에 의해 조회됩니다. 위젯은 부모 컨텍스트에서이 빈을 검색 할 것입니다 (자식 컨텍스트를 인식하고 있는가?). 적어도 부모 컨텍스트를 참조하는 새로운 ClasspathAppcontext를 만들면 bean을 찾을 수 없습니다 (부모 컨텍스트 xml에서 정의하지 않은 경우). –

+0

불행히도 wicket에 익숙하지 않지만 @SpringBean (SpringComponentInjector?)의 메커니즘을 심도있게 조사 할 것입니다. 어쩌면 그것을 사용자 정의/대체 할 수 있고 모든 하위 컨텍스트를 검사하는 확장 찾아보기를 구현할 수 있습니다. 명시 적 조회 순서로 이러한 알고리즘을 심각하게 고려할 것입니다. bean 이름이 겹치면 어떻게해야합니까? - 세계 공간으로서의 다소 결정적이지 않은 부모 컨텍스트. – mrembisz

답변

1

이것은 내가 해냈어 정확히 사실이다. 우리는 3 년 넘게이 패션을 사용해 왔으며 결코 문제가 없었습니다.

0

AutowireCapableBeanFactory를 사용할 수 있습니다. 이 클래스를 사용하면 기존 Spring 컨텍스트에 빈을 추가 할 수있다. 빈을 인스턴스화하고 종속성을 주입합니다.

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/config/AutowireCapableBeanFactory.html

은 내가 얘기하고있는 "양방향"상황에 맞는 일을 이해 모르겠어요. "자식"/ 추가 컨텍스트의 bean에 대한 종속성을 가지기 위해 기본 컨텍스트 bean이 필요합니까? 그렇다면 와일드 카드 가져 오기가 그 해결책을 선호하지 않더라도 최선의 방법 일 것입니다.

"부모"/ 기본 컨텍스트와 "자식"/ 추가 컨텍스트의 단계를 설명하면서 전체 응용 프로그램 수명주기에 대해 조금 더 자세히 설명해 주시면 도움이 될 것입니다.

관련 문제