1: Pengantar Anotasi Java
Anotasi sering digunakan dalam pengembangan, dan kadang -kadang saya melihat anotasi khusus dalam proyek. Hari ini, mari kita bahas apa anotasi itu, serta skenario aplikasi anotasi dan bagaimana menyesuaikan anotasi.
Daftar anotasi umum berikut dalam pengembangan
@Override: Digunakan untuk mengidentifikasi bahwa metode ini mewarisi dari superclass. Ketika metode kelas induk dihapus atau dimodifikasi, kompiler akan meminta pesan kesalahan (Anda selalu dapat melihat ini pada metode tostring () yang paling sering kita lihat)
@Deprecated: Ini berarti bahwa kelas atau metode ini sudah usang dan telah kedaluwarsa. Jika pengguna masih ingin menggunakannya, peringatan kompilasi akan dihasilkan.
@SuppressWarnings: Pesan peringatan kompiler untuk diabaikan
Tes junit: @test
Beberapa Anotasi Musim Semi: @Controller, @RequestMapping, @RequestParam, @ResponseBody, @Service, @Component, @Repository, @Resource, @autowire
Anotasi untuk Verifikasi Java: @notnull, @email
Mari kita lihat wajah sejati Gunung Lu di override anotasi.java
@Target (elementType.method) @retention (retentionpolicy.source) public @interface override {} 2: Pengetahuan Dasar Anotasi Java
1. Java Anotasi Jenis Data
Anotasi ditulis dalam file .java dan menggunakan @Interface sebagai kata kunci, jadi anotasi juga merupakan tipe data Java. Dari definisi luas, kelas, antarmuka, enum, dan anotasi adalah semua jenis kelas.
2. Java Meta Anotasi
Saat membuat anotasi, Anda perlu menggunakan beberapa anotasi untuk menggambarkan anotasi yang Anda buat, yaitu anotasi yang ditulis di @Interface. Anotasi ini disebut anotasi meta, seperti @target, @retention, dll. Terlihat di Override. Berikut beberapa anotasi meta
@Documented: Digunakan untuk menandai apakah anotasi disertakan saat menghasilkan javadoc. Anda dapat melihat bahwa anotasi ini sama dengan @Override, anotasi kosong dan tidak ada apa -apa.
@Didokumentasikan@retensi (retentionpolicy.runtime) @target (elementType.annotation_type) public @interface didokumentasikan {}@Target: Digunakan untuk menentukan di mana anotasi dapat digunakan. Secara default, dapat digunakan di mana saja, atau dapat menentukan ruang lingkup penggunaan. Dalam pengembangan, lebih umum untuk menggunakan anotasi pada kelas (seperti @Controller), bidang (seperti @Autowire), metode (seperti @RequestMapping), parameter metode (seperti @RequestParam), dll.
Jenis: Deklarasi Kelas, Antarmuka, atau Enum
Bidang: Domain (atribut) deklarasi
Metode: Metode Deklarasi
Parameter: Deklarasi Parameter
Konstruktor: Deklarasi Metode Konstruktor
Local_variable: Deklarasi Variabel Lokal
Annotation_type: Deklarasi Jenis Komentar
Paket: Pernyataan Paket
Target.java
@Didokumentasikan@retensi (retentionpolicy.runtime) @target (elementType.annotation_type) public @interface target { /** * Mengembalikan array jenis elemen jenis anotasi * dapat diterapkan. * @return Sebuah array dari jenis elemen jenis anotasi * dapat diterapkan ke nilai */ elementType [] ();} Publik enum elementType { /** kelas, antarmuka (termasuk tipe anotasi), atau deklarasi enum* /type, /** Deklarasi lapangan (termasuk konstanta enum)* /bidang, /** Metode Deklarasi* /Metode, /** Deklarasi Parameter Formal*Deklarasi Lokal*Deklarasi Lokal* */ Annotation_type,/ ** Paket Deklarasi*/ Paket,/ ** Ketik Deklarasi Parameter*/ type_parameter,/ ** Penggunaan tipe*/ type_use}@InHerited: Memungkinkan subclass untuk mewarisi anotasi di kelas induk, dan dapat memperoleh anotasi kelas induk melalui refleksi.
@Didokumentasikan@retensi (retentionpolicy.runtime) @target (elementType.annotation_type) public @interface diwariskan {}@Constraint: Digunakan untuk memverifikasi apakah nilai atributnya legal
@Didokumentasikan@target ({elementType.annotation_type})@retention (retentionpolicy.runtime) public @interface Constraint {class <? Extends ConseptValidator <?,? >> [] ValidatedBy ();}@Retention: Siklus deklarasi anotasi digunakan untuk menentukan tahap kelangsungan hidup anotasi. Ini dapat bertahan di level kode sumber, level kompilasi (level kode byte), dan level runtime.
Sumber: Level kode sumber, anotasi hanya ada dalam kode sumber, dan umumnya digunakan untuk berinteraksi dengan kompiler dan digunakan untuk mendeteksi kode. Seperti @Override, @suppresswarings.
Kelas: level bytecode, anotasi ada dalam kode sumber dan file bytecode. Mereka terutama digunakan untuk menghasilkan file tambahan selama kompilasi, seperti xml, file java, dll., Tetapi tidak dapat diperoleh selama runtime. Misalnya, MyBatis menghasilkan file entitas dan pemetaan. Pada level ini, perlu untuk menambahkan proxy (JavaAgent) ketika JVM dimuat, dan menggunakan proxy untuk secara dinamis memodifikasi file bytecode.
Runtime: Level runtime, anotasi ada dalam kode sumber, bytecode, dan mesin virtual Java. Mereka terutama digunakan untuk runtime, dan refleksi dapat digunakan untuk mendapatkan informasi yang relevan.
@Didokumentasikan@retensi (retentionpolicy.runtime) @target (elementType.annotation_type) public @interface retensi { /*** Mengembalikan kebijakan retensi. * @Kemburkan Kebijakan Retensi */ Nilai RetensiPolicy ();} 3. Isi Anotasi Java
Dalam kode sumber anotasi di atas, Anda dapat melihat bahwa beberapa anotasi tidak memiliki konten, dan beberapa anotasi memiliki konten, yang tampaknya seperti metode.
Format Sintaks dari Konten Beranotasi: Jenis Data Name Atribut () Nilai Default Default, Tipe Data digunakan untuk menjelaskan tipe data atribut. Nilai default berarti bahwa ketika tidak ada atribut yang ditetapkan, nilai default digunakan. Secara umum, string menggunakan string kosong "" sebagai nilai default, dan array umumnya menggunakan array kosong {} sebagai nilai default.
Mari kita lihat pernyataan anotasi permintaan di SpringMVC
@Target ({elementType.method, elementType.type})@retention (retentionPolicy.runtime)@didokumentasikan@mappingpublic @interface requestMapping {string name () default ""; @Aliasfor ("path") string [] value () default {}; @Aliasfor ("value") string [] path () default {}; RequestMethod [] metode () default {}; String [] params () default {}; Header string [] () default {}; String [] konsumen () default {}; String [] menghasilkan () default {};}Menggunakan anotasi requestmapping di springmvc
@RequestMapping (value = "/list", method = requestMethod.post, menghasilkan = {"Application/json; charset = utf-8;"}) daftar string publik () {} 4. Gunakan skenario anotasi
Anda dapat menganalisis skenario penggunaan anotasi melalui periode deklarasi anotasi:
Level Kode Sumber Sumber: Untuk kompiler, seperti @Override, @Deprecated, dll., Tidak ada banyak skenario yang harus digunakan pengembang.
Kelas: level bytecode, bagian ini jarang terlihat
Runtime: Level runtime, ini adalah yang paling umum, dan hampir semua anotasi yang digunakan oleh pengembang adalah level runtime. Anotasi runtime umumnya digunakan dalam situasi berikut
Anotasi tanpa atribut dalam anotasi. Bagian anotasi ini biasanya berperan sebagai anotasi, seperti @test, @before, @after. Dengan mendapatkan anotasi tag ini, beberapa pemrosesan logis dilakukan.
Anda dapat menggunakan anotasi kendala @constraint untuk memverifikasi nilai atribut, seperti @email, @notnull, dll.
Anda dapat mengonfigurasi beberapa parameter dengan menggunakan properti dalam anotasi, dan kemudian Anda dapat menggunakan refleksi untuk mendapatkan parameter ini. Anotasi ini tidak memiliki fungsi khusus lainnya, mereka hanya mengkonfigurasi beberapa parameter alih -alih konfigurasi XML. Menggunakan Anotasi untuk Mengkonfigurasi Parameter Ini populer di Spring Boot, seperti @configuration
Mengenai metode konfigurasi XML vs anotasi, umumnya menggunakan XML untuk mengonfigurasi beberapa konfigurasi yang tidak terlalu dekat dengan hubungan bisnis, dan menggunakan anotasi untuk mengonfigurasi beberapa parameter yang terkait erat dengan bisnis.
Tiga: Java Anotasi dan Refleksi API Dasar
// Dapatkan anotasi dari tipe publik tertentu <A Extends Annotation> a getAnnotation (kelas <a> annotationClass); // Dapatkan semua anotasi (termasuk anotasi yang dimodifikasi oleh diwarisi dalam kelas induk) anotasi publik [] getAnnotations (); // Dapatkan anotasi yang dinyatakan (tetapi tidak termasuk anotasi yang dimodifikasi oleh diwarisi dalam kelas induk) anotasi publik [] getDeclaredAnnotations (); // Uji apakah suatu objek dianotasi oleh anotasi public boolean isnotation (class <? Extends annotation> annotationclass public -field) SecurityException; // Dapatkan metode tertentu metode publik getMethod (nama string, kelas <?> ... parameterTypes);
Empat: Anotasi Kustom
Gunakan Anotasi Kustom + Pencegat atau AOP untuk mengontrol izin.
Contoh berikut digunakan untuk menentukan anotasi untuk membatasi pengguna harus masuk saat mengakses antarmuka.
Langkah 1: Tentukan anotasi
Membutuhkanlogin.java
@Didokumentasikan@target ({elementType.method})@retention (retentionpolicy.runtime) public @interface memerlukan login {}Langkah 2: Gunakan anotasi
@Controller @requestMapping ("/user") kelas publik usercontroller {@requireslogin @requestmapping (value = "/list", menghasilkan = {"application/json; charset = utf-8;"}) string publik getUserList () {System.out.println ("----------- return "[{'id': 1, 'username': 'zhangsan'}]"; }}Langkah 3: Gunakan AOP untuk mencegat dan menguraikan anotasi
Public Class LoginAdvices {public void Sebelumnya (joinpoint goinpoint) melempar Exception {object target = joinpoint.getTarget (); String methodName = joinpoint.getSignature (). GetName (); System.out.println (target + "-------" + MethodName); Metode metode = target.getClass (). GetMethod (methodName); boolean annotationpresent = Method.isannotationPresent (needtLogin.class); if (annotationpresent) {// pengguna harus masuk boolean islogin = false; if (! isLogin) {lempar pengecualian baru ("Anda harus masuk untuk mengakses antarmuka ini"); } else {System.out.println ("Login ..."); }}}}Konfigurasikan AOP di ApplicationContext.xml
<bean id = "loginadvices"/> <!-konfigurasi AOP-> <aop: config proxy-target-class = "true"> <!-bagian-> <aop: aspek ref = "loginadvices"> <!-point-> <aop: pointcut id = "pointcut1" ekspresi = "eksekusi (*com.mengdee. Metode dan titik pemberitahuan-> <aop: sebelum metode = "sebelum" pointcut-ref = "pointcut1"/> </aop: aspek> </aop: config>
Pengecualian khusus
Mengapa menyesuaikan pengecualian
Meskipun Java menyediakan beragam kelas penanganan pengecualian, pengecualian khusus sering digunakan dalam proyek. Alasan utama adalah bahwa kelas pengecualian yang disediakan oleh Java masih tidak dapat memenuhi kebutuhan berbagai bisnis dalam beberapa kasus. Misalnya, beberapa kesalahan dalam sistem mematuhi sintaks Java, tetapi jangan mematuhi logika bisnis. Jika akun tidak ada ketika pengguna masuk atau akun terkunci, Anda dapat menyesuaikan akun Account Exception AccountException.
Atau dalam beberapa kasus, pengecualian yang sama di Java mungkin disebabkan oleh berbagai alasan. Tidak mudah untuk menemukan kesalahan saat pemecahan masalah masalah. Saat ini, Anda dapat menggunakan kustomisasi pengecualian yang lebih jelas.
Manfaat Pengecualian Kustom: Pengecualian khusus dapat membuat pengecualian lebih jelas dan menyembunyikan pengecualian yang mendasarinya, yang lebih aman dan lebih intuitif.
Penggunaan Pengecualian Kustom: Pengecualian khusus umumnya diwarisi dari pengecualian atau runtimeException. Menurut kebutuhan bisnis, beberapa atribut dapat diambil sebagai parameter konstruktor. Pengecualian khusus mengharuskan programmer untuk secara manual melempar pengecualian dan menangani pengecualian.
Di bawah ini adalah contoh pengecualian khusus di Apache Shiro
kelas publik ShiroException memperluas runtimeException {public shiroException () {} public shiroException (string message) {super (pesan); } public shiroException (Throwable Cause) {super (penyebab); } public shiroException (pesan string, penyebab yang dapat dilempar) {super (pesan, penyebab); }}Di atas adalah deskripsi terperinci tentang anotasi java dan anotasi khusus