Artikel ini memperkenalkan penulisan AOP berdasarkan Spring Boot dan JDK8, menggabungkan anotasi khusus untuk mencapai verifikasi parameter antarmuka umum.
alasan
Saat ini, metode verifikasi parameter yang umum digunakan adalah menambahkan anotasi pada kelas entitas, tetapi untuk metode yang berbeda, aturan verifikasi yang diterapkan juga berbeda. Misalnya, ada entitas AccountVo:
Public Class AccountVo {Private String Name; // Sebutkan usia bilangan bulat pribadi; // Usia}Misalkan ada bisnis: Ketika seorang pengguna mendaftar, ia perlu mengisi namanya, dan ketika seorang pengguna masuk, ia hanya perlu mengisi namanya. Maka jelas tidak pantas untuk menambahkan aturan verifikasi ke kelas entitas.
Oleh karena itu, saya selalu ingin menerapkan verifikasi parameter tingkat metode. Metode yang berbeda dapat menerapkan aturan verifikasi yang berbeda untuk parameter entitas yang sama, yang melahirkan alat ini dan telah digunakan dalam pekerjaan sehari -hari untuk waktu yang lama.
memperkenalkan
Mari kita lihat cara menggunakannya terlebih dahulu:
@ServicePublic Class Testimpl mengimplementasikan itestService {@Override @check ({"name", "use"}) public void testValid (AccountVo vo) {// ...}}Anotasi @Check pada metode ini menunjukkan bahwa nama dan properti usia dalam parameter AccountVo tidak dapat kosong. Selain verifikasi yang tidak kosong, ini juga mendukung penilaian ukuran dan verifikasi kesetaraan:
@Check ({"id> = 8", "name! = Aaa", "title <10"})Pesan kesalahan default mengembalikan bidang, penyebab kesalahan dan metode yang dipanggil, seperti:
updateUserid tidak boleh nol saat memanggil testvalidid harus> = 8 saat memanggil testValidName harus! = aaa saat memanggil testValid
Informasi pengembalian kesalahan khusus juga didukung:
@Check ({"title <= 8: Jumlah karakter judul tidak melebihi 8 karakter, termasuk tanda baca"}) public void testValid (testpo po) {// ...}Cukup tambahkan: Setelah aturan verifikasi dan tulis informasi khusus, yang akan menggantikan pesan kesalahan default.
PS: Prinsip inti adalah untuk mendapatkan nilai bidang dalam entitas parameter melalui refleksi, dan kemudian memverifikasi sesuai dengan aturan. Oleh karena itu, saat ini hanya metode yang berisi satu parameter yang didukung, dan parameter tidak dapat dari tipe dasar.
menggunakan
Cara menggunakan AOP di boot Spring Saya tidak akan masuk ke detail di sini, dan terutama memperkenalkan kode inti di AOP.
Ketergantungan Maven
Selain ketergantungan musim semi, dependensi pihak ketiga yang diperlukan bukanlah dependensi inti, dan Anda dapat memilih sesuai dengan kebiasaan pribadi Anda:
<!-Untuk verifikasi string-> <dependency> <GroupId> org.apache.commons </groupId> <ArtifactId> commons-lang3 </artifactid> <version> 3.3.2 </version> </dependency> <!-untuk pencetakan log-> <groupid> <orgf4j4j </groupid> <trupt4 <version> 1.7.25 </version> </gantisan>
Anotasi khusus
Impor java.lang.annotation.elementType; impor java.lang.annotation.retention; impor java.lang.annotation.target; impor java.lang.annotation.RetentionPolicy.runtime; */@Target ({elementType.type, elementType.method})@retensi (runtime) public @interface check {// aturan verifikasi bidang, format: nama bidang + aturan verifikasi + pesan kesalahan kolon, misalnya: id <10: id harus kurang dari 10 string [] nilai ();}Kode inti
Dengan mencegat metode antarmuka dengan anotasi @Check, lakukan verifikasi parameter sebelum metode dijalankan. Jika ada pesan kesalahan, itu akan dikembalikan secara langsung:
@Around (value = "@com.cipher.checker.check") // Di sini Anda perlu mengubah ke jalur pemeriksaan objek publik anotasi khusus (ProsesingJoINPoint point) melempar Throwable {objek obj; // string verifikasi parameter msg = docheck (point); if (! stringutils.isempty (msg)) {// di sini Anda dapat mengembalikan kelas pengembalian yang dienkapsulasi lemparan IllegalArgumentException baru (msg); } obj = point.proed (); kembalikan obj;}Metode verifikasi inti dalam metode Docheck, prinsip utamanya adalah untuk mendapatkan nama bidang dan aturan verifikasi yang ditentukan pada anotasi, memperoleh nilai bidang yang sesuai dalam entitas parameter melalui refleksi, dan kemudian melakukan verifikasi:
/*** Verifikasi Parameter** @param Point PrencingJoInpoint* @Return Message Kesalahan*/Private String Docheck (ProsesingJoINPoint Point) {// Dapatkan Metode Parameter Nilai Objek [] Argumen = point.getArgs (); // Dapatkan metode metode metode = getMethod (point); String methodInfo = stringutils.isempty (method.getName ())? "": "saat memanggil" + method.getName (); String msg = ""; if (isCheck (Method, argumen)) {centang annotation = method.getAnnotation (check.class); String [] bidang = annotation.value (); Objek vo = argumen [0]; if (vo == null) {msg = "param tidak bisa null"; } else {for (string field: fields) {// parsing fieldInfo info = resolvefield (bidang, methodInfo); // Dapatkan nilai nilai objek bidang = reflectionutil.invokegetter (vo, info.field); // jalankan aturan verifikasi boolean isValid = info.optenum.fun.apply (value, info.operatornum); msg = isValid? msg: info.innermsg; }}} return msg;}Anda dapat melihat bahwa logika utamanya adalah:
Bidang Parse -> Dapatkan Nilai Bidang -> Eksekusi Aturan Verifikasi
Kelas enumerasi dipertahankan secara internal, dan operasi verifikasi yang relevan ditentukan di dalamnya:
/** * Operasi enum */enum operator {/** * lebih besar dari */lebih besar_than (">", checkparamaspect :: isGreatreThan),/** * lebih besar dari atau sama dengan */lebih besar_than_equal ("> =", checkparamaspect :: isGreaterThanequal),/** lebih rendah */LEBIHAN (" /** * Less than or equal to */ LESS_THAN_EQUAL("<=", CheckParamAspect::isLessThanEqual), /** * Not equal to */ NOT_EQUAL("!=", CheckParamAspect::isNotEqual), /** * Not empty*/ NOT_NULL("not null", CheckParamAspect::isNotNull); nilai string pribadi; Bifungsi pribadi <objek, string, boolean> menyenangkan; Operator (nilai string, bifunction <object, string, boolean> fun) {this.value = value; this.fun = fun; }} Karena alasan ruang, saya tidak akan memperluas semua kode satu per satu. Teman yang tertarik bisa mendapatkan semua kode sumber di alamat berikut: ciphermagic/java-learn/sandbox/checker
Todo
akhirnya
Terima kasih atas bacaan Anda. Teman -teman yang menyukainya bisa menyukainya di GitHub. Jika Anda memiliki pertanyaan atau saran, silakan tinggalkan pesan di bawah ini dan nantikan balasan Anda.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.