2013-09-08 74 views
19

Trong Spring MVC, có hai ngữ cảnh. Một là ngữ cảnh ứng dụng hoặc ngữ cảnh toàn cục được khởi động bởi ContextLoaderListener. Nó lấy tất cả các tệp cấu hình được đề cập trong tham số contextConfigLocation.Tại sao Spring MVC cần ít nhất hai bối cảnh?

Bây giờ nếu bạn đang sử dụng Spring MVC, thì Dispatcher servlet là bắt buộc, khởi động lên một vùng chứa khác còn được gọi là vùng chứa ứng dụng web. Vùng chứa này lấy vùng chứa toàn cầu làm cha mẹ.

Khi tích hợp struts1 vào mùa xuân, chỉ có một ngữ cảnh. Tại sao mvc mùa xuân cần hai? Có thể sử dụng chỉ một ngữ cảnh khi sử dụng mvc mùa xuân?

cảm ơn!

Trả lời

12

Hãy tưởng tượng bạn có hai Công cụ phân tách riêng biệt, mỗi Công cụ phục vụ một mục đích khác nhau và mỗi mục đích có các phụ thuộc riêng của nó. Bạn sẽ định cấu hình chúng một cách độc lập bằng cách sử dụng các bối cảnh riêng biệt.

Nếu có bất kỳ cấu hình được chia sẻ nào, điều này có thể đi theo ngữ cảnh 'chung'. Tôi không nghĩ rằng nó có thể chỉ có một bối cảnh bằng cách sử dụng DispatcherServlet, vì nó tạo ra bối cảnh riêng của nó và liên kết nó với bối cảnh cha mẹ (thông qua lớp cha của FrameworkServlet).

FrameworkServlet.createWebApplicationContext

14

Có một bối cảnh ứng dụng web gốc cộng với một bối cảnh servlet con chỉ là một lựa chọn. Nếu bạn biết rằng ứng dụng của bạn sẽ không có servlet thứ hai, thì có thể dễ dàng có một ngữ cảnh Spring duy nhất cho toàn bộ ứng dụng web.

Bạn có thể đạt được thiết lập mà bằng cách đơn giản loại bỏ các ContextLoaderListener (và kèm theo contextConfigLocation ngữ cảnh param) từ web.xml của bạn và di chuyển tất cả các định nghĩa bean vào xml xác định bối cảnh servlet ([servlet-name]-servlet.xml).

Điều này là có thể, vì FrameworkServlet (siêu hạng DispatcherServlet) không quan tâm nếu có ngữ cảnh ứng dụng gốc khi tạo ngữ cảnh servlet. Nó chỉ chuyển tiếp ngữ cảnh gốc làm cha mẹ nếu có. Xem related code here.

5

Kiểm tra câu trả lời này About multiple containers in spring framework

Có, bạn chỉ có thể có một ngữ cảnh.

Để sử dụng lại mã, sẽ tốt hơn nếu cô lập dịch vụ trong ngữ cảnh ứng dụng thay vì sau đó WebApplicationContext.but này không phải là compulsion.you chỉ có thể giữ cho webApplicationcontext.