Di mana harus meletakkan file konfigurasi Spring?

18

Saya ingin mengintegrasikan kerangka kerja Spring dalam proyek saya terutama ke sisi server.

Jadi, saya tidak ingin memasukkannya ke dalam folder file perang WEB-INF.

Haruskah saya meletakkan applicationContext.xml ke dalam setiap lapisan (berarti setiap proyek sejak dibagi dalam proyek yang berbeda? (Layanan, Domain, dan DAO)

Apa praktik yang baik?

Mik378
sumber
2
Ini mungkin relevan: stackoverflow.com/questions/5967405/…
NoChance

Jawaban:

25

The struktur file Maven dapat membantu dengan ini

Pada dasarnya file konfigurasi Spring (yang dapat memiliki nama apa pun, bukan hanya generik applicationContext.xml) diperlakukan sebagai sumber daya classpath dan diajukan di bawah src/main/resources. Selama proses pembangunan, ini kemudian disalin ke WEB-INF/classesdirektori yang merupakan tempat normal untuk file-file ini berakhir.

Variasi termasuk springdirektori tambahan (misalnya src/main/resources/spring) untuk memisahkan konteks Spring dari sumber daya lain yang didedikasikan untuk kerangka kerja aplikasi. Anda mungkin ingin membagi konteks aplikasi menjadi lapisan khusus seperti:

example-servlet.xml
example-data.xml
example-security.xml

dan seterusnya.

Bagaimana dengan lingkungan yang berbeda seperti dev / test / produksi?

Biasanya, konfigurasi Spring Anda harus mengambil konfigurasi lingkungan dari, ahem, lingkungannya. Biasanya ini berarti menggunakan JNDI, JDBC, variabel lingkungan atau file properti eksternal untuk menyediakan konfigurasi yang diperlukan. Saya daftar mereka dalam urutan preferensi karena JNDI umumnya lebih mudah untuk mengelola daripada file properti eksternal dalam kluster produksi yang dikendalikan.

Dalam hal pengujian integrasi, Anda mungkin perlu menggunakan file konfigurasi Spring "hanya test". Ini akan berisi konteks khusus yang menggunakan kacang tes atau konfigurasi. Ini akan hadir di bawah src / test / resource dan mungkin memiliki test-awalan untuk memastikan bahwa pengembang mengetahui tujuan mereka. Penggunaan tipikal adalah menyediakan DataSource non-JNDI yang mungkin menargetkan basis data HSQLDB selama pembuatan tes otomatis dan akan dirujuk dalam kasus uji.

Namun, secara umum sebagian besar file konteks Musim Semi Anda tidak perlu modifikasi khusus saat mereka bergerak di antara tingkatan. Seharusnya artefak build yang sama (misalnya file WAR) digunakan dalam dev / test / produksi hanya dengan kredensial yang berbeda.

Gary Rowe
sumber
2

Apakah proyek Anda terbagi dalam modul Maven? Jika demikian, Anda dapat menambahkan modul tambahan hanya untuk file konfigurasi. Mari kita sebut itu config-module

config-module
      |
      |--> src\main\resources\config\spring\applicationContex.xml
      |--> src\main\resources\config\properties\application.properties
      |--> pom.xml

Konfigurasi seperti itu adalah saran. Atur file Anda sendiri. Atur paketnya seperti JAR dan tambahkan modul ini sebagai dependensi dari modul lain mana pun (web, ear lib, toples lain).

Anda akan memiliki akses ke sumber - sumber modul-konfigurasi (xml, properti, dll.) Karena mereka ada di classpath.

modul web pom

<dependency>
    <groupId>com.myproject.group</groupId>
    <artifactId>config-module</artifactId>
</dependency>

Kemudian gunakan pernyataan impor dari file konteks Spring eksternal. Sebagai contoh

<import resource="classpath*:com/package/subpackage/**/config/applicationContext.xml" />
Laiv
sumber
Ini ide yang bagus! Saya mengambil kebebasan untuk menambahkan sedikit tambahan karena "sumber daya impor" contoh Anda tidak berfungsi untuk saya ...... Saya masih mempelajari "pemfilteran" dari pernyataan impor (berdasarkan nama paket lengkap) ... dan saya tidak berusaha mengatasi cegukan (untuk pembaca masa depan) untuk mengalihkan perhatian dari ide dan jawaban hebat ini. Laiv terima kasih!
granadaCoder
Salah satu alasan mengapa impor "apa yang menurut saya harus berhasil" gagal karena bug ini: github.com/spring-projects/spring-framework/issues/16017
granadaCoder