Sự khác biệt giữa ApplicationContext và WebApplicationContext trong Spring MVC là gì?


193

Sự khác biệt giữa bối cảnh ứng dụng và bối cảnh ứng dụng web là gì?

Tôi biết rằng WebApplicationContextđược sử dụng cho các ứng dụng định hướng kiến ​​trúc Spring MVC?

Tôi muốn biết những gì được sử dụng ApplicationContexttrong các ứng dụng MVC? Và những loại đậu được định nghĩa trong ApplicationContext?


5
Tôi không tin rằng đó là bản sao của stackoverflow.com/questions/3652090/ Khăn Câu hỏi đó hỏi về nội dung của web.xmltệp; Câu hỏi này là hỏi về một số lớp học mùa xuân.
Raedwald

@Raedwald điều đó không đúng. Câu hỏi khác không phải là nói về web.xmlmà là nói về các biến thể cấu hình bean Spring XML của ApplicationContextWebApplicationContext. Tất cả các định nghĩa bean trong applicationContext.xmlsẽ có sẵn trong ApplicationContextkhi tất cả các định nghĩa bean trong *-servlet.xmlsẽ có sẵn trong a WebApplicationContext.
g00glen00b

Câu trả lời:


228

Bối cảnh ứng dụng Web Bối cảnh ứng dụng mở rộng được thiết kế để hoạt động với javax.servlet.ServletContext tiêu chuẩn để nó có thể giao tiếp với container.

public interface WebApplicationContext extends ApplicationContext {
    ServletContext getServletContext();
}

Đậu, được khởi tạo trong WebApplicationContext cũng sẽ có thể sử dụng ServletContext nếu chúng triển khai giao diện ServletContextAware

package org.springframework.web.context;
public interface ServletContextAware extends Aware { 
     void setServletContext(ServletContext servletContext);
}

Có rất nhiều điều có thể thực hiện với cá thể ServletContext, ví dụ như truy cập tài nguyên WEB-INF (cấu hình xml và v.v.) bằng cách gọi phương thức getResourceAsStream (). Thông thường, tất cả các bối cảnh ứng dụng được xác định trong web.xml trong ứng dụng Spring của servlet là các bối cảnh Ứng dụng Web, điều này đi vào cả bối cảnh ứng dụng web gốc và bối cảnh ứng dụng của servlet.

Ngoài ra, tùy thuộc vào khả năng ngữ cảnh của ứng dụng web có thể khiến ứng dụng của bạn khó kiểm tra hơn một chút và bạn có thể cần sử dụng lớp MockServletContext để kiểm tra.

Sự khác biệt giữa bối cảnh servlet và root Spring cho phép bạn xây dựng hệ thống phân cấp bối cảnh ứng dụng đa cấp, do đó, bean yêu cầu sẽ được tìm nạp từ bối cảnh cha nếu nó không có trong bối cảnh ứng dụng hiện tại. Trong các ứng dụng web như mặc định, có hai cấp độ phân cấp, bối cảnh root và servlet : Servlet và bối cảnh gốc.

Điều này cho phép bạn chạy một số dịch vụ dưới dạng singletons cho toàn bộ ứng dụng (Spring Security bean và các dịch vụ truy cập cơ sở dữ liệu cơ bản thường cư trú ở đây) và các dịch vụ khác như các dịch vụ riêng biệt trong các máy chủ tương ứng để tránh xung đột tên giữa các bean. Ví dụ, một bối cảnh servlet sẽ phục vụ các trang web và một bối cảnh khác sẽ triển khai một dịch vụ web không trạng thái.

Sự phân tách hai cấp này xuất hiện trong hộp khi bạn sử dụng các lớp spring servlet: để định cấu hình bối cảnh ứng dụng gốc, bạn nên sử dụng thẻ bối cảnh-param trong tệp webDB của bạn

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/root-context.xml
            /WEB-INF/applicationContext-security.xml
    </param-value>
</context-param>

(bối cảnh ứng dụng gốc được tạo bởi ContextLoaderListener , được khai báo trong tệp web.xml

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> 

) và thẻ servlet cho bối cảnh ứng dụng servlet

<servlet>
   <servlet-name>myservlet</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>app-servlet.xml</param-value>
   </init-param>
</servlet>

Xin lưu ý rằng nếu init-param sẽ bị bỏ qua, thì spring sẽ sử dụng myservlet-servlet.xml trong ví dụ này.

Xem thêm: Sự khác biệt giữa applicationContext.xml và spring-servlet.xml trong Spring Framework


2
Rất cám ơn câu trả lời. Tôi đã nghe nói rằng có hai loại bối cảnh cũng được sử dụng cho một ứng dụng web. Một cái dùng làm bối cảnh ứng dụng gốc trong đó các định nghĩa không liên quan đến web được cung cấp dịch vụ ví dụ, cấu hình dao, v.v. và cái kia dành cho cấu hình dành riêng cho web như Handler Mappings, v.v. Trước đây phục vụ như bối cảnh cha mẹ và sau này phục vụ như Bối cảnh con . Tôi muốn biết làm thế nào để tuyên bố cấu trúc này. Tôi đã nghe nói về một số cuộc gọi lại ContextListener. Nhưng tôi khá không rõ ràng về nó.
Sumit Trehan

1
Cấu trúc như vậy được mã hóa cứng trong các công cụ Spring servlet, luôn có ít nhất hai bối cảnh ứng dụng trong ứng dụng web mùa xuân, xem câu trả lời được cập nhật, tôi hy vọng nó có ích.
Boris Treukhov

Sự mô tả tuyệt vời..tôi có một số nghi ngờ về kịch bản
này..tôi

"Bean yêu cầu sẽ được tìm nạp từ bối cảnh cha nếu nó không có trong bối cảnh ứng dụng hiện tại". Bạn có thể giải thích như thế nào? Làm thế nào một bối cảnh ứng dụng web có thể truy cập các bean trong bối cảnh ứng dụng gốc? Liên kết với ví dụ nào?
anir

14

Quay trở lại ngày Servlet, web.xml chỉ có thể có một <context-param>, vì vậy chỉ có một đối tượng bối cảnh được tạo khi máy chủ tải một ứng dụng và dữ liệu trong ngữ cảnh đó được chia sẻ giữa tất cả các tài nguyên (Ví dụ: Servlets và JSP). Nó giống như có tên trình điều khiển cơ sở dữ liệu trong ngữ cảnh, sẽ không thay đổi. Theo cách tương tự, khi chúng ta khai báo paramConfigLocation trong <contex-param>Spring sẽ tạo một đối tượng Bối cảnh ứng dụng.

 <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>com.myApp.ApplicationContext</param-value>
 </context-param>

Bạn có thể có nhiều Servlets trong một ứng dụng. Ví dụ: bạn có thể muốn xử lý / bảo mật / * yêu cầu theo một cách và / không seucre / * theo cách khác. Đối với mỗi Servlets này, bạn có thể có một đối tượng ngữ cảnh, đó là WebApplicationContext.

<servlet>
    <servlet-name>SecureSpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>com.myapp.secure.SecureContext</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>SecureSpringDispatcher</servlet-name>
    <url-pattern>/secure/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>NonSecureSpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>com.myapp.non-secure.NonSecureContext</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>NonSecureSpringDispatcher</servlet-name>
    <url-pattern>/non-secure/*</url-patten>
</servlet-mapping>

13

Câu trả lời được chấp nhận là thông qua nhưng có lời giải thích chính thức về điều này:

WebApplicationContext là một phần mở rộng của ApplicationContext đơn giản có một số tính năng bổ sung cần thiết cho các ứng dụng web. Nó khác với ApplicationContext thông thường ở chỗ nó có khả năng giải quyết các chủ đề (xem Sử dụng chủ đề) và nó biết Servlet nào được liên kết với nó (bằng cách có liên kết đến ServletContext). WebApplicationContext bị ràng buộc trong ServletContext và bằng cách sử dụng các phương thức tĩnh trên lớp RequestContextUtils, bạn luôn có thể tra cứu WebApplicationContext nếu bạn cần truy cập vào nó.

Trích dẫn từ tài liệu tham khảo khung web mùa xuân

Bằng cách này, servlet và bối cảnh gốc là cả webApplicationContext:

Phân cấp ngữ cảnh điển hình trong Spring Web MVC


6

ApplicationContext (Ngữ cảnh ứng dụng gốc): Mỗi ứng dụng web Spring MVC đều có tệp applicationContext.xml được cấu hình là gốc của cấu hình ngữ cảnh. Spring tải tệp này và tạo một applicationContext cho toàn bộ ứng dụng. Tệp này được tải bởi ContextLoaderListener, được cấu hình như một tham số ngữ cảnh trong tệp web.xml. Và sẽ chỉ có một applicationContext cho mỗi ứng dụng web.

WebApplicationContext: WebApplicationContext là một bối cảnh ứng dụng nhận biết web tức là nó có thông tin ngữ cảnh của servlet. Một ứng dụng web có thể có nhiều WebApplicationContext và mỗi servlet Dispatcher (là bộ điều khiển phía trước của kiến ​​trúc Spring MVC) được liên kết với một WebApplicationContext. Tệp cấu hình webApplicationContext * -servlet.xml dành riêng cho một DispatcherServlet. Và vì một ứng dụng web có thể có nhiều hơn một bộ điều phối được cấu hình để phục vụ nhiều yêu cầu, nên có thể có nhiều hơn một tệp webApplicationContext cho mỗi ứng dụng web.


3

Bối cảnh ứng dụng web , được chỉ định bởi WebApplicationContextgiao diện, là bối cảnh ứng dụng Spring cho ứng dụng web. Nó có tất cả các thuộc tính của bối cảnh ứng dụng Spring thông thường, với điều kiện WebApplicationContextgiao diện mở rộng ApplicationContextgiao diện và thêm phương thức truy xuất API Servlet tiêu chuẩn ServletContextcho ứng dụng web.

Ngoài các phạm vi đậu mùa xuân tiêu chuẩn singletonprototype, có ba phạm vi bổ sung có sẵn trong ngữ cảnh ứng dụng web:

  • request- phạm vi một định nghĩa bean duy nhất cho vòng đời của một yêu cầu HTTP; nghĩa là, mỗi yêu cầu HTTP có một thể hiện riêng của một bean được tạo ra từ mặt sau của một định nghĩa bean duy nhất
  • session - phạm vi một định nghĩa bean duy nhất cho vòng đời của Phiên HTTP
  • application - phạm vi một định nghĩa đậu duy nhất đến vòng đời của một ServletContext
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.