2011-05-18 56 views
10

Tôi đang xử lý một ứng dụng web Spring MVC được khởi động bằng cách sử dụng DispatcherServlet. Nó tạo ra một XmlWebApplicationContext trong đó quản lý toàn bộ ứng dụng:Phân cấp bối cảnh mùa xuân với ngữ cảnh ứng dụng web

<servlet> 
    <servlet-name>springmvc</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:springmvc-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Bây giờ có một số module cần được nạp trong thời gian chạy bằng cách sử dụng ContextSingletonBeanFactoryLocator. Do đó, mỗi mô-đun có ClasspathXmlApplicationContext riêng. Vì vậy, một mô-đun có thể tham chiếu đậu từ XmlWebApplicationContext, nó phải được gắn vào XmlWebApplicationContext để tạo thành một hệ thống phân cấp theo ngữ cảnh trong đó XmlWebApplicationContext nên đóng vai trò của phụ huynh và ClasspathXmlApplicationContext của mô-đun vai trò của ngữ cảnh con. Đáng tiếc là tôi không thể kết nối chúng bằng cách sử

<beans> 
    <bean id="moduleContext" 
     class="org.springframework.context.support.ClassPathXmlApplicationContext"> 
     <constructor-arg> 
      ... 
     </constructor-arg> 
     <constructor-arg ref="parentContext" /> 
    </bean> 
</beans> 

vì tôi đã tìm thấy không có cách nào cho đến nay để cung cấp cho các WebApplicationContext tên parentContext. Tôi đã bỏ qua một cái gì đó hoặc là có một cách tốt hơn/dễ dàng hơn để đạt được như vậy trong một thời trang khác nhau?

Trả lời

2

Nếu bạn đang sử dụng chú thích, bạn có thể làm điều này:

@Inject 
private XmlWebApplicationContext context; 

@Inject 
private List<ClassPathXmlApplicationContext> childs; 

@PostConstruct 
public void refreshContext() { 
    for(ClassPathXmlApplicationContext appContext : childs) { 
     appContext.setParent(context); 
    } 
    context.refresh(); 
} 

Bạn có thể làm điều đó mà không cần chú thích quá, bằng cách sử dụng các giao diện InitializingBean và ApplicationContextAware.

Đã chỉnh sửa:childs được tự động theo loại, vì vậy, Spring sẽ tiêm tất cả các bean đang là một thể hiện của ClassPathXmlApplicationContext.

+0

Tôi có thể nhận được 'childs' từ đâu nếu tôi không biết trước? – aha

+0

Tôi đã thử mã bạn đề xuất. Nó hoạt động, nhưng không truyền đến 'ContextSingletonBeanFactoryLocator'. Nhưng nó đi đúng hướng: Con đường để đi không phải là sử dụng một 'ContextSingletonBeanFactoryLocator' nhưng để tự nạp các bối cảnh con (sử dụng một' GenericApplicationContext') và đính kèm chúng vào bối cảnh cha mẹ trong một 'InitializingBean'. – aha

Các vấn đề liên quan