Konfigurasi Proyek dengan Spring

Daftar Isi

  • 1. Konfigurasi Harus Spesifik Lingkungan
  • 2. File .properties untuk Setiap Lingkungan
  • 3. Konfigurasi Pegas
  • 4. Pengaturan Properti di Setiap Lingkungan
  • 5. Pengujian dan Maven
  • 6. Melangkah Lebih Jauh
  • 7. Kesimpulan

1. Konfigurasi Harus Khusus Lingkungan

Konfigurasi harus spesifik lingkungan - itu hanya fakta kehidupan. Jika bukan itu masalahnya, maka itu tidak akan menjadi konfigurasi dan kami hanya akan memasukkan nilai hardcode dalam kode.

Untuk aplikasi Spring, ada beberapa solusi yang dapat Anda gunakan - dari solusi sederhana hingga alternatif yang sangat fleksibel dan sangat kompleks.

Salah satu solusi yang lebih umum dan langsung adalah penggunaan file properti yang fleksibel dan dukungan properti kelas satu yang disediakan oleh Spring.

Sebagai bukti konsep, untuk keperluan artikel ini, kita akan melihat satu jenis properti tertentu - konfigurasi database. Sangat masuk akal untuk menggunakan satu jenis konfigurasi database untuk produksi, yang lain untuk pengujian, dan yang lainnya untuk lingkungan dev.

2. File .properties untuk Setiap Lingkungan

Mari kita mulai Pembuktian Konsep kita - dengan menentukan lingkungan yang ingin kita targetkan:

  • Dev
  • Pementasan
  • Produksi

Berikutnya - mari buat 3 file properti - satu untuk masing-masing lingkungan berikut:

  • persistence-dev.properties
  • persistence-staging.properties
  • persistence-production.properties

Dalam aplikasi Maven tipikal, ini bisa berada di src / main / resources , tetapi di mana pun mereka berada, mereka harus tersedia di classpath saat aplikasi di-deploy.

Catatan penting - memiliki semua file properti di bawah kontrol versi membuat konfigurasi jauh lebih transparan dan dapat direproduksi. Ini bertentangan dengan memiliki konfigurasi pada disk di suatu tempat dan hanya mengarahkan Spring ke mereka.

3. Konfigurasi Pegas

Di Spring, kami akan menyertakan file yang benar berdasarkan lingkungan:

Hal yang sama tentu saja dapat dilakukan dengan konfigurasi Java:

@PropertySource({ "classpath:persistence-${envTarget:dev}.properties" })

Pendekatan ini memungkinkan fleksibilitas memiliki beberapa file *. Properti untuk tujuan tertentu dan terfokus . Misalnya - dalam kasus kami, konfigurasi Spring persistence mengimpor properti persistence - yang sangat masuk akal. Konfigurasi keamanan akan mengimpor properti terkait keamanan dan seterusnya.

4. Pengaturan Properti di Setiap Lingkungan

Perang terakhir yang dapat diterapkan akan berisi semua file properti - untuk persistensi, tiga varian persistensi - *. Properti . Karena nama file sebenarnya berbeda, tidak ada rasa takut untuk tidak sengaja memasukkan file yang salah. Kami akan mengatur para envTarget variabel dan dengan demikian pilih contoh yang kita inginkan dari varian yang ada beberapa.

The envTarget variabel dapat diatur dalam OS / lingkungan atau sebagai parameter untuk baris perintah JVM:

-DenvTarget=dev

5. Pengujian dan Maven

Untuk pengujian integrasi yang memerlukan pengaktifan persistensi - kami cukup menyetel properti envTarget di pom.xml:

 org.apache.maven.plugins maven-surefire-plugin   h2_test   

File persistence-h2_test.properties yang sesuai dapat ditempatkan di src / test / resources sehingga file tersebut hanya akan digunakan untuk pengujian dan tidak perlu disertakan dan disebarkan dengan perang pada waktu proses.

6. Melangkah Lebih Jauh

Ada beberapa cara untuk membangun fleksibilitas tambahan ke dalam solusi ini jika diperlukan.

Salah satu caranya adalah dengan menggunakan pengkodean yang lebih kompleks untuk nama file properti, yang menentukan tidak hanya lingkungan tempat mereka akan digunakan, tetapi juga informasi lebih lanjut (seperti penyedia persistensi). Misalnya, kita mungkin menggunakan jenis properti berikut: persistence-h2.properties , persistence-mysql.properties atau, bahkan lebih spesifik: persistence-dev_h2.properties , persistence-staging_mysql.properties , persistence-production_amazonRDS.properties .

Keuntungan dari konvensi penamaan semacam itu - dan ini hanya konvensi karena tidak ada yang berubah dalam pendekatan keseluruhan - hanyalah transparansi. Sekarang menjadi lebih jelas apa yang dilakukan konfigurasi hanya dengan melihat nama:

  • persistence-dev_h2.properties : penyedia persistensi untuklingkungan dev adalah database H2 dalam memori yang ringan
  • persistence-staging_mysql.properties : penyedia persistensi untuklingkungan staging adalah instance MySQL
  • persistence-production_amazon_rds.propertie : penyedia persistensi untuklingkungan produksi adalah Amazon RDS

7. Kesimpulan

Artikel ini membahas solusi fleksibel untuk melakukan konfigurasi khusus lingkungan di Spring. Solusi alternatif menggunakan profil dapat ditemukan di sini.

Implementasi solusi dapat ditemukan di proyek GitHub - ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.