Apa perbedaan antara ApplicationContext dan WebApplicationContext di Spring MVC?

193

Apa perbedaan antara Konteks Aplikasi dan Konteks Aplikasi Web?

Saya sadar bahwa WebApplicationContextini digunakan untuk aplikasi berorientasi arsitektur Spring MVC?

Saya ingin tahu apa gunanya ApplicationContextaplikasi MVC? Dan jenis kacang apa yang didefinisikan ApplicationContext?

Sumit Trehan
sumber
5
Saya tidak percaya itu adalah duplikat dari stackoverflow.com/questions/3652090/... Pertanyaan itu menanyakan tentang isi web.xmlfile; pertanyaan ini menanyakan tentang beberapa kelas Musim Semi.
Raedwald
@Redwald itu tidak benar. Pertanyaan lain tidak berbicara tentang web.xmltetapi berbicara tentang varian konfigurasi kacang XML Spring ApplicationContextdan WebApplicationContext. Semua definisi kacang dalam applicationContext.xmlakan tersedia ApplicationContextsementara sementara semua definisi kacang dalam *-servlet.xmlakan tersedia dalam a WebApplicationContext.
g00glen00b

Jawaban:

228

Konteks Aplikasi Web memperluas Konteks Aplikasi yang dirancang untuk bekerja dengan javax.servlet.ServletContext standar sehingga dapat berkomunikasi dengan wadah.

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

Kacang, instantiated di WebApplicationContext juga akan dapat menggunakan ServletContext jika mereka mengimplementasikan antarmuka ServletContextAware

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

Ada banyak hal yang mungkin dilakukan dengan instance ServletContext, misalnya mengakses sumber daya WEB-INF (konfigurasi xml dan lain-lain) dengan memanggil metode getResourceAsStream (). Biasanya semua konteks aplikasi yang didefinisikan dalam web.xml dalam servlet Spring application adalah konteks Aplikasi Web, ini berlaku untuk konteks root webapp dan konteks aplikasi servlet.

Juga, tergantung pada kemampuan konteks aplikasi web dapat membuat aplikasi Anda sedikit lebih sulit untuk diuji, dan Anda mungkin perlu menggunakan kelas MockServletContext untuk pengujian.

Perbedaan antara konteks servlet dan root Spring memungkinkan Anda untuk membangun hierarki konteks aplikasi bertingkat, sehingga kacang yang diperlukan akan diambil dari konteks induk jika tidak ada dalam konteks aplikasi saat ini. Dalam aplikasi web sebagai default ada dua tingkat hirarki, akar dan servlet konteks: Servlet dan konteks root.

Ini memungkinkan Anda untuk menjalankan beberapa layanan sebagai lajang untuk seluruh aplikasi (kacang Spring Security dan layanan akses basis data dasar biasanya berada di sini) dan layanan lain sebagai layanan terpisah di servlet yang sesuai untuk menghindari bentrokan nama di antara kacang. Misalnya satu konteks servlet akan melayani halaman web dan lainnya akan menerapkan layanan web stateless.

Pemisahan dua tingkat ini keluar dari kotak ketika Anda menggunakan kelas servlet musim semi: untuk mengkonfigurasi konteks aplikasi root Anda harus menggunakan tag konteks-param di web.xml Anda

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

(konteks aplikasi root dibuat oleh ContextLoaderListener yang dideklarasikan di web.xml

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

) dan tag servlet untuk konteks aplikasi 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>

Harap dicatat bahwa jika init-param akan dihilangkan, maka pegas akan menggunakan myservlet-servlet.xml dalam contoh ini.

Lihat juga: Perbedaan antara applicationContext.xml dan spring-servlet.xml di Spring Framework

Boris Treukhov
sumber
2
Terima kasih banyak atas jawabannya. Saya telah mendengar bahwa ada dua jenis konteks yang juga digunakan untuk aplikasi web. Satu berfungsi sebagai konteks aplikasi root di mana definisi non-web terkait disediakan contoh layanan, konfigurasi dao dll, dan yang lainnya adalah untuk konfigurasi spesifik web seperti Pemetaan Handler dll. Sebelumnya berfungsi sebagai konteks induk dan yang terakhir berfungsi sebagai Konteks Anak . Saya ingin tahu cara mendeklarasikan struktur ini. Saya telah mendengar beberapa panggilan balik ContextListener. Tapi saya tidak begitu jelas tentang itu.
Sumit Trehan
1
Struktur seperti itu di-hardcode dalam alat servlet Spring, selalu ada setidaknya dua konteks aplikasi di aplikasi web spring, lihat jawaban yang diperbarui, saya harap ini membantu.
Boris Treukhov
Discription yang sangat baik..saya ragu pada scenario..saya ini pada tahap awal saya menemukan jawaban yang berguna untuk mendapatkan pengetahuan ..
user533
"Kacang yang diperlukan akan diambil dari konteks induk jika tidak ada dalam konteks aplikasi saat ini". Bisakah Anda menjelaskan caranya? Bagaimana konteks aplikasi web dapat mengakses kacang dalam konteks aplikasi root? Tautan ke contoh apa saja?
anir
14

Kembali ke hari-hari Servlet, web.xml hanya dapat memiliki satu <context-param>, jadi hanya satu objek konteks yang dibuat ketika server memuat aplikasi dan data dalam konteks itu dibagi di antara semua sumber daya (Contoh: Servlets dan JSP). Ini sama dengan memiliki nama driver Database dalam konteks, yang tidak akan berubah. Dengan cara yang sama, ketika kita mendeklarasikan param contextConfigLocation di <contex-param>Spring menciptakan satu objek Konteks Aplikasi.

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

Anda dapat memiliki beberapa Servlet dalam suatu aplikasi. Misalnya Anda mungkin ingin menangani / mengamankan / * permintaan dengan satu cara dan / non-seucre / * dengan cara lain. Untuk setiap Servlet ini, Anda dapat memiliki objek konteks, yang merupakan 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>
Ben Tennyson
sumber
13

Jawaban yang diterima adalah melalui tetapi ada penjelasan resmi tentang ini:

WebApplicationContext adalah ekstensi dari ApplicationContext biasa yang memiliki beberapa fitur tambahan yang diperlukan untuk aplikasi web. Ini berbeda dari ApplicationContext normal karena mampu menyelesaikan tema (lihat Menggunakan tema), dan ia tahu Servlet mana yang dikaitkan (dengan memiliki tautan ke ServletContext). WebApplicationContext terikat dalam ServletContext, dan dengan menggunakan metode statis pada kelas RequestContextUtils Anda selalu dapat mencari WebApplicationContext jika Anda memerlukan akses ke sana.

Dikutip dari referensi kerangka web Spring

Omong-omong servlet dan konteks root keduanya webApplicationContext:

Hierarki konteks umum di Spring Web MVC

Nick Allen
sumber
6

ApplicationContext (Root Application Context): Setiap aplikasi web MVC Spring memiliki file applicationContext.xml yang dikonfigurasi sebagai akar dari konfigurasi konteks. Pegas memuat file ini dan membuat konteks aplikasi untuk seluruh aplikasi. File ini diambil oleh ContextLoaderListener yang dikonfigurasi sebagai parameter konteks dalam file web.xml. Dan hanya akan ada satu applicationContext per aplikasi web.

WebApplicationContext: WebApplicationContext adalah konteks aplikasi sadar web yaitu memiliki informasi konteks servlet. Aplikasi web tunggal dapat memiliki beberapa WebApplicationContext dan setiap servlet Dispatcher (yang merupakan pengontrol depan arsitektur Spring MVC) dikaitkan dengan WebApplicationContext. File konfigurasi webApplicationContext * -servlet.xml khusus untuk DispatcherServlet. Dan karena aplikasi web dapat memiliki lebih dari satu servlet operator yang dikonfigurasi untuk melayani beberapa permintaan, mungkin ada lebih dari satu file webApplicationContext per aplikasi web.

Hetal Rachh
sumber
3

Konteks aplikasi web , yang ditentukan oleh WebApplicationContextantarmuka, adalah konteks aplikasi Spring untuk aplikasi web. Ia memiliki semua properti konteks aplikasi Musim Semi biasa, mengingat bahwa WebApplicationContextantarmuka memperluas ApplicationContextantarmuka, dan menambahkan metode untuk mengambil API Servlet standar ServletContextuntuk aplikasi web.

Selain lingkup kacang Spring standar singletondan prototype, ada tiga cakupan tambahan yang tersedia dalam konteks aplikasi web:

  • request- cakupan definisi kacang tunggal ke siklus hidup permintaan HTTP tunggal; yaitu, setiap permintaan HTTP memiliki instance kacang yang dibuat dari belakang definisi kacang tunggal
  • session - cakupan definisi kacang tunggal ke siklus hidup Sesi HTTP
  • application - Lingkup definisi kacang tunggal ke siklus hidup a ServletContext
DimaSan
sumber