32

Trong một dự án Spring MVC điển hình có hai "vùng chứa": một vùng chứa được tạo bởi ContextLoaderListener và một được tạo bởi DispatchServlet.Giới thiệu về nhiều thùng chứa trong khung công tác xuân

Tôi muốn biết, là những thực sự hai IoC dụ container? (Tôi thấy hai tập tin cấu hình đậu, một là root-context.xml khác là servlet-context.xml)

Nếu có 2 container, thì mối quan hệ là gì?

Hạt có thể được khai báo trong một thùng chứa được sử dụng trong hộp kia không?

+0

Chúng không tạo hai trường hợp vùng chứa khác nhau, thay vì hai bối cảnh ứng dụng khác nhau. –

+0

Xem [bài đăng này] (http: // stackoverflow.com/q/7774295/1679863) –

+0

Sau nhiều năm, tôi đã đọc mã nguồn của mùa xuân. Bây giờ, tôi có thể nói: 1) có, có hai trường hợp của ApplicationContext (mỗi trường hợp sẽ bao gồm một thể hiện của beanFactory) 2) thể hiện của lớp mvc là con và giữ một tham chiếu của cá thể mẹ. 3) đậu trong ví dụ mẹ có thể được sử dụng bởi trẻ em, nhưng đậu ở trẻ em không thể được sử dụng bởi cha mẹ. – lovespring

Trả lời

41

Từ Spring Official Website:

Giao diện org.springframework.context.ApplicationContext đại diện container Spring IoC và chịu trách nhiệm tạo đối tượng, cấu hình, và lắp ráp các loại đậu nói trên. Vùng chứa sẽ được hướng dẫn về các đối tượng cần khởi tạo, định cấu hình và lắp ráp bằng cách đọc siêu dữ liệu cấu hình. Siêu dữ liệu cấu hình được thể hiện bằng XML, chú thích Java hoặc mã Java.

Again từ Doc chính thức:

Trong khuôn khổ MVC Web, mỗi DispatcherServlet có WebApplicationContext riêng của mình, mà được thừa hưởng tất cả các hạt cà phê đã được xác định trong các WebApplicationContext gốc. Những hạt đậu kế thừa này có thể là được ghi đè trong phạm vi cụ thể của servlet và bạn có thể xác định các hạt đậu tương ứng mới cục bộ cho một cá thể Servlet cụ thể.

Bây giờ đến câu hỏi của bạn, như được nêu here:

Trong các ứng dụng web mùa xuân, có hai loại container, mỗi mà được cấu hình và khởi tạo khác nhau. Một là “Ngữ cảnh ứng dụng” và một là “Ngữ cảnh ứng dụng web”. Cho phép nói chuyện đầu tiên về “Ngữ cảnh ứng dụng”.Application Context là container khởi tạo bởi một ContextLoaderListener hoặc ContextLoaderServlet định nghĩa trong web.xml và cấu hình sẽ giống như thế này:

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

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:*-context.xml</param-value> 
</context-param> 

Trong cấu hình ở trên, tôi đang hỏi mùa xuân để tải tất cả các file từ đường dẫn lớp phù hợp với * -context.xml và tạo một Ứng dụng Ngữ cảnh từ đó. Ví dụ, bối cảnh này có thể chứa các thành phần chẳng hạn như các dịch vụ giao dịch ở tầng giữa, đối tượng truy cập dữ liệu hoặc các đối tượng khác mà bạn có thể muốn sử dụng (và sử dụng lại) trên ứng dụng . Sẽ có một ngữ cảnh ứng dụng cho mỗi ứng dụng.

Ngữ cảnh khác là “WebApplicationContext” là ngữ cảnh của trẻ em ngữ cảnh của ứng dụng. Mỗi DispatcherServlet được định nghĩa trong ứng dụng web mùa xuân sẽ có một liên kết WebApplicationContext. Việc khởi của WebApplicationContext xảy ra như thế này:

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

Bạn cung cấp tên của tập tin cấu hình mùa xuân như một tham số khởi tạo servlet . Điều quan trọng cần nhớ ở đây là tên của XML phải có dạng -servlet. xml. Trong ví dụ này, tên của servlet là nền tảng dịch vụ do đó tên của XML của chúng ta phải là platform-service-servlet.xml. Bất kỳ bean nào có sẵn trong ApplicationContext đều có thể được gọi đến từ mỗi WebApplicationContext. Cách tốt nhất là giữ tách biệt giữa các dịch vụ trung cấp như logic nghiệp vụ thành phần và lớp truy cập dữ liệu (thường được xác định trong ApplicationContext) và các thành phần liên quan đến web như bộ điều khiển và xem trình phân giải (được định nghĩa trong WebApplicationContext trên mỗi Servatcher Dispatcher).

Kiểm tra những liên kết này

Difference between applicationContext.xml and spring-servlet.xml in Spring Framework

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-basics

+3

Xin nhắc lại, vui lòng trích dẫn chính xác và liên kết bất kỳ nguồn nào bạn sao chép từ ngữ. Tôi đã làm điều đó ở trên, nhưng chắc chắn rằng bạn làm điều này trong tương lai. –

5

Không có hai vùng chứa riêng được tạo. Thông thường, bạn muốn mùa xuân để khởi tạo đối tượng được khai báo trong servlet-context.xml khi đối tượng được yêu cầu. Vì vậy, bạn ánh xạ tệp cấu hình servlet-context.xml tới Servatcher Dispatcher tức là bạn muốn khởi tạo đối tượng khi một yêu cầu truy cập servlet dispatcher.

<servlet> 
    <servlet-name>appServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Trong trường hợp như, nếu bạn muốn khởi tạo đối tượng và thực hiện thao tác khi bối cảnh đang được nạp, bạn sẽ khai báo tập tin cấu hình với trong context-param thẻ của bộ mô tả triển khai.

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

Bạn có thể kiểm tra điều này bằng cách viết ra bằng cách tuyên bố đậu riêng biệt trong servlet-context.xml và gốc-context.xml và sau đó, autowiring chúng trong một tùy chỉnh Context Loader Listener lớp. Bạn sẽ chỉ tìm thấy các thể hiện của bối cảnh gốc được khởi tạo và các bean bối cảnh servlet là null.

0

Spring MVC có ít nhất 2 container -

  1. Application Context tuyên bố bởi

    <context-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value>/WEB-INF/spring/root-context.xml</param-value> 
    </context-param> 
    
  2. Servlet bối cảnh tuyên bố bởi -

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

Và một ứng dụng web có thể xác định bất kỳ số DispatcherServlet 's. Mỗi servlet sẽ hoạt động trong không gian tên riêng của nó, tải ngữ cảnh ứng dụng của riêng nó bằng ánh xạ, trình xử lý, v.v. Chỉ ngữ cảnh ứng dụng gốc được tải bởi ContextLoaderListener, nếu có, sẽ được chia sẻ. Do đó có thể có bất kỳ số lượng container con.

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