Berikut adalah pengantar untuk setiap teknologi yang disebutkan.
Musim Semi-DAO
Spring-DAO bukanlah modul pegas dalam arti yang sebenarnya, melainkan konvensi yang harus mendikte Anda untuk menulis DAO, dan menulisnya dengan baik. Dengan demikian, ini tidak menyediakan antarmuka atau implementasi atau template untuk mengakses data Anda. Saat menulis DAO, Anda harus menambahkan catatan @Repository
sehingga pengecualian yang terkait dengan teknologi yang mendasarinya (JDBC, Hibernate, JPA, dll.) Secara konsisten diterjemahkan ke dalam DataAccessException
subkelas yang sesuai .
Sebagai contoh, misalkan Anda sekarang menggunakan Hibernate, dan lapisan layanan Anda menangkapnya HibernateException
untuk bereaksi. Jika Anda mengubah ke JPA, antarmuka DAO Anda tidak boleh berubah, dan lapisan layanan akan tetap dikompilasi dengan blok yang menangkap HibernateException
, tetapi Anda tidak akan pernah memasukkan blok ini karena DAO Anda sekarang melemparkan JPA PersistenceException
. Dengan menggunakan @Repository
DAO Anda, pengecualian yang ditautkan ke teknologi yang mendasari diterjemahkan ke Spring DataAccessException
; lapisan layanan Anda menangkap pengecualian ini dan jika Anda memutuskan untuk mengubah teknologi persistensi, Spring yang sama DataAccessExceptions
akan tetap dilemparkan karena spring telah menerjemahkan pengecualian asli.
Namun perlu dicatat bahwa ini memiliki penggunaan terbatas karena alasan berikut:
- Biasanya Anda tidak akan menangkap pengecualian persistensi, karena penyedia mungkin telah membatalkan transaksi (bergantung pada subtipe pengecualian persisnya), dan karenanya Anda tidak boleh melanjutkan eksekusi dengan jalur alternatif.
- Hierarki pengecualian biasanya lebih kaya di penyedia Anda daripada yang disediakan Spring, dan tidak ada pemetaan pasti dari satu penyedia ke penyedia lainnya. Mengandalkan ini berbahaya. Namun
@Repository
, sebaiknya beri anotasi pada DAO Anda dengan , karena kacang akan ditambahkan secara otomatis oleh prosedur pemindaian. Lebih lanjut, Spring dapat menambahkan fitur berguna lainnya ke anotasi.
Musim Semi-JDBC
Spring-JDBC menyediakan kelas JdbcTemplate, yang menghapus kode pipa dan membantu Anda berkonsentrasi pada kueri dan parameter SQL. Anda hanya perlu mengkonfigurasinya dengan a DataSource
, dan Anda kemudian dapat menulis kode seperti ini:
int nbRows = jdbcTemplate.queryForObject("select count(1) from person", Integer.class);
Person p = jdbcTemplate.queryForObject("select first, last from person where id=?",
rs -> new Person(rs.getString(1), rs.getString(2)),
134561351656L);
Spring-JDBC juga menyediakan JdbcDaoSupport, yang dapat Anda kembangkan untuk mengembangkan DAO Anda. Ini pada dasarnya mendefinisikan 2 properti: Sumber Data dan JdbcTemplate yang keduanya dapat digunakan untuk mengimplementasikan metode DAO. Ini juga menyediakan penerjemah pengecualian dari pengecualian SQL ke dataAccessExceptions musim semi.
Jika Anda berencana menggunakan jdbc biasa, ini adalah modul yang perlu Anda gunakan.
Spring-ORM
Spring-ORM adalah modul payung yang mencakup banyak teknologi persistensi, yaitu JPA, JDO, Hibernate, dan iBatis. Untuk setiap teknologi ini, Spring menyediakan kelas integrasi sehingga setiap teknologi dapat digunakan mengikuti prinsip konfigurasi Spring, dan terintegrasi dengan lancar dengan manajemen transaksi Spring.
Untuk setiap teknologi, konfigurasi pada dasarnya terdiri dari menginjeksi DataSource
kacang ke dalam sejenis kacang SessionFactory
atau EntityManagerFactory
dll. Untuk JDBC murni, tidak diperlukan kelas integrasi seperti itu (selain JdbcTemplate), karena JDBC hanya mengandalkan DataSource.
Jika Anda berencana menggunakan ORM seperti JPA atau Hibernate, Anda tidak memerlukan spring-jdbc, tetapi hanya modul ini.
Spring-Data
Spring-Data adalah proyek payung yang menyediakan API umum untuk menentukan cara mengakses data (anotasi DAO +) dengan cara yang lebih umum, mencakup sumber data SQL dan NOSQL.
Ide awalnya adalah untuk menyediakan teknologi sehingga pengembang menulis antarmuka untuk DAO (metode finder) dan kelas entitas dengan cara agnostik teknologi dan, berdasarkan konfigurasi saja (penjelasan tentang DAO & entitas + konfigurasi pegas, baik itu xml- atau berbasis java), memutuskan teknologi implementasi, baik itu JPA (SQL) atau redis, hadoop, dll. (NOSQL).
Jika Anda mengikuti konvensi penamaan yang ditentukan oleh spring untuk nama metode finder, Anda bahkan tidak perlu menyediakan string kueri yang sesuai dengan metode finder untuk kasus yang paling sederhana. Untuk situasi lain, Anda harus menyediakan string kueri di dalam anotasi pada metode finder.
Saat konteks aplikasi dimuat, pegas menyediakan proxy untuk antarmuka DAO, yang berisi semua kode boilerplate yang terkait dengan teknologi akses data, dan memanggil kueri yang dikonfigurasi.
Spring-Data berkonsentrasi pada teknologi non-SQL, tetapi masih menyediakan modul untuk JPA (satu-satunya teknologi SQL).
Apa berikutnya
Mengetahui semua ini, Anda sekarang harus memutuskan apa yang akan dipilih. Kabar baiknya di sini adalah Anda tidak perlu membuat pilihan akhir yang pasti untuk teknologi tersebut. Di sinilah sebenarnya kekuatan Spring berada: sebagai pengembang, Anda berkonsentrasi pada bisnis saat Anda menulis kode, dan jika Anda melakukannya dengan baik, mengubah teknologi yang mendasarinya adalah detail implementasi atau konfigurasi.
- Tentukan model data dengan kelas POJO untuk entitas, dan dapatkan / setel metode untuk mewakili atribut entitas dan hubungan dengan entitas lain. Anda pasti perlu membuat anotasi kelas entitas dan bidang berdasarkan teknologi, tetapi untuk saat ini, POJO sudah cukup untuk memulai. Konsentrasi saja pada kebutuhan bisnis untuk saat ini.
- Tentukan antarmuka untuk DAO Anda. 1 DAO mencakup tepat 1 entitas, tetapi Anda pasti tidak memerlukan DAO untuk masing-masing entitas, karena Anda harus dapat memuat entitas tambahan dengan menavigasi hubungan. Tentukan metode finder mengikuti konvensi penamaan yang ketat.
- Berdasarkan ini, orang lain bisa mulai mengerjakan lapisan layanan, dengan tiruan untuk DAO Anda.
- Anda mempelajari berbagai teknologi persistensi (sql, no-sql) untuk menemukan yang paling sesuai dengan kebutuhan Anda, dan memilih salah satunya. Berdasarkan ini, Anda membuat anotasi entitas dan mengimplementasikan DAO (atau membiarkan spring mengimplementasikannya untuk Anda jika Anda memilih untuk menggunakan spring-data).
- Jika persyaratan bisnis berkembang dan teknologi akses data Anda tidak cukup untuk mendukungnya (katakanlah, Anda memulai dengan JDBC dan beberapa entitas, tetapi sekarang membutuhkan model data yang lebih kaya dan JPA adalah pilihan yang lebih baik), Anda harus mengubah penerapannya DAO Anda, tambahkan beberapa anotasi pada entitas Anda dan ubah konfigurasi pegas (tambahkan definisi EntityManagerFactory). Kode bisnis Anda yang lain seharusnya tidak melihat dampak lain dari perubahan Anda.
Catatan: Manajemen Transaksi
Spring menyediakan API untuk manajemen transaksi. Jika Anda berencana menggunakan pegas untuk akses data, Anda juga harus menggunakan pegas untuk manajemen transaksi, karena keduanya terintegrasi dengan sangat baik. Untuk setiap teknologi akses data yang didukung oleh pegas, ada pengelola transaksi yang cocok untuk transaksi lokal, atau Anda dapat memilih JTA jika Anda membutuhkan transaksi terdistribusi. Semuanya menerapkan API yang sama, sehingga (sekali lagi) pilihan teknologi hanyalah masalah konfigurasi yang dapat diubah tanpa berdampak lebih jauh pada kode bisnis.
Catatan: Dokumentasi musim semi
Tautan ke dokumentasi Spring yang Anda sebutkan agak lama. Berikut adalah dokumentasi dari rilis terbaru (4.1.6, mencakup semua topik):
Spring-data bukan bagian dari framework Spring. Ada modul umum yang harus Anda baca terlebih dahulu agar terbiasa dengan prinsip. Dokumentasi dapat ditemukan di sini: