Aplikasi web pegas standar (dibuat oleh Roo atau Template "Proyek MVC Musim Semi") membuat web.xml dengan ContextLoaderListener
dan DispatcherServlet
. Mengapa mereka tidak hanya menggunakan DispatcherServlet
dan membuatnya untuk memuat konfigurasi lengkap?
Saya memahami bahwa ContextLoaderListener harus digunakan untuk memuat hal-hal yang tidak relevan dengan web dan DispatcherServlet digunakan untuk memuat hal-hal yang relevan dengan web (Pengontrol, ...). Dan ini menghasilkan dua konteks: konteks orang tua dan anak.
Latar Belakang:
Saya melakukannya dengan cara standar ini selama beberapa tahun.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Handles Spring requests -->
<servlet>
<servlet-name>roo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/spring/webmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Hal ini seringkali menimbulkan masalah pada kedua konteks dan ketergantungan di antara keduanya. Di masa lalu saya selalu dapat menemukan solusi, dan saya memiliki perasaan kuat bahwa ini membuat struktur / arsitektur perangkat lunak selalu lebih baik. Tapi sekarang saya menghadapi masalah dengan kejadian dari kedua konteks tersebut .
- Namun ini membuat saya memikirkan ulang dua pola konteks ini, dan saya bertanya pada diri sendiri: mengapa saya harus membawa diri saya ke dalam masalah ini, mengapa tidak memuat semua file konfigurasi pegas dengan satu DispatcherServlet
dan menghapus ContextLoaderListener
sepenuhnya. (Saya masih akan memiliki file konfigurasi yang berbeda, tetapi hanya satu konteks.)
Apakah ada alasan untuk tidak menghapus ContextLoaderListener
?
sumber
Jawaban:
Dalam kasus Anda, tidak, tidak ada alasan untuk menyimpan
ContextLoaderListener
danapplicationContext.xml
. Jika aplikasi Anda berfungsi dengan baik hanya dengan konteks servlet, tetap dengan itu, itu lebih sederhana.Ya, pola yang umumnya dianjurkan adalah menyimpan barang non-web dalam konteks tingkat aplikasi web, tetapi itu tidak lebih dari konvensi yang lemah.
Satu-satunya alasan kuat untuk menggunakan konteks tingkat webapp adalah:
DispatcherServlet
yang perlu berbagi layananDelegatingFilterProxy
,OpenEntityManagerInViewFilter
, dll)Tak satu pun dari ini berlaku untuk Anda, jadi kerumitan ekstra tidak beralasan.
Berhati-hatilah saat menambahkan tugas latar belakang ke konteks servlet, seperti tugas terjadwal, koneksi JMS, dll. Jika Anda lupa menambahkan
<load-on-startup>
keweb.xml
, maka tugas ini tidak akan dimulai hingga akses pertama servlet.sumber
DispatcherServlet
tanpa konfigurasi - jika Anda melakukannya, Anda tidak akan memiliki antarmuka web. Semua barang MVC harus masuk ke sana.Anda juga dapat mengkonfigurasi konteks aplikasi sebaliknya. Misalnya untuk membuat OpenEntityManagerInViewFilter berfungsi. Siapkan ContextLoaderListener lalu konfigurasikan DispatcherServlet Anda dengan:
Pastikan saja bahwa nilai parameter contextConfigLocation kosong.
sumber
Saya ingin membagikan apa yang telah saya lakukan pada aplikasi Spring-MVC saya:
Di
we-mvc-config.xml
saya menambahkan hanya kelas yang dianotasi dengan @Controller:Pada
applicationContext.xml
file saya menambahkan yang lainnya:sumber