Anotasi di musim semi dapat dibagi secara kasar menjadi dua kategori:
1) anotasi yang terkait dengan wadah kacang musim semi, atau pabrik kacang;
2) Anotasi yang terkait dengan SpringMVC.
Anotasi yang terkait dengan wadah kacang musim semi meliputi: @Required, @Autowired, @postconstruct, @predestory, dan anotasi dalam javax standar JSR-330.
Anotasi terkait SpringMVC meliputi: @Controller, @RequestMapping, @RequestParam, @ResponseBody, dll.
Untuk memahami anotasi di musim semi, Anda harus terlebih dahulu memahami anotasi di Java.
1. Anotasi di Java
Anotasi telah mulai diperkenalkan di Java 1.5. Yang paling kami kenal seharusnya: @Override, yang didefinisikan sebagai berikut:
/** * menunjukkan bahwa deklarasi metode dimaksudkan untuk mengganti deklarasi metode * dalam supertype. Jika suatu metode dianotasi dengan * kompiler tipe anotasi ini diperlukan untuk menghasilkan pesan kesalahan * kecuali setidaknya salah satu dari kondisi berikut berlaku: * Metode tersebut mengesampingkan atau mengimplementasikan metode yang dinyatakan dalam * supertype. * Metode ini memiliki tanda tangan yang override-setara dengan * metode publik apa pun yang dinyatakan dalam objek. * * @author Peter von der Ahé * @author Joshua Bloch * @jls 9.6.1.4 @Override * @since 1.5 */ @target (elementType.method) @retention (retentionpolicy.source) publik override {}Dari anotasi, kita dapat melihat bahwa fungsi @Override adalah untuk meminta kompiler yang metode yang digunakan oleh anotasi @Override harus mengganti kelas induk atau metode dengan nama yang sama di java.lang.object. Kami melihat bahwa @target dan @retention digunakan dalam definisi @Override. Mereka adalah apa yang disebut "meta-anotasi"-mereka adalah anotasi yang menentukan anotasi, atau anotasi yang dianotasi (pusing ...). Mari kita lihat @retention
/** * Menunjukkan berapa lama anotasi dengan tipe beranotasi untuk * dipertahankan. Jika tidak ada anotasi retensi yang ada pada * deklarasi jenis anotasi, kebijakan retensi default ke * retensipolicy.class. * /@Didokumentasikan@retensi (retentionpolicy.runtime) @target (elementType.annotation_type) public @interface retensi { /*** Mengembalikan kebijakan retensi. * @Kemburkan Kebijakan Retensi */ Nilai RetensiPolicy ();}@Retention digunakan untuk mendorong berapa lama anotasi dipertahankan. Ada tiga nilai:
PUBLIK ENUM RetensiPolicy { /*** Anotasi harus diungkapkan oleh kompiler. * / Sumber, / ** * Anotasi harus direkam dalam file kelas oleh kompiler * tetapi tidak perlu dipertahankan oleh VM pada waktu lari. Ini adalah perilaku default *. * / Class, / ** * Anotasi harus direkam dalam file kelas oleh kompiler dan * disimpan oleh VM pada waktu berjalan, sehingga mereka dapat dibaca secara reflektif. * * @see java.lang.reflect.annotatedElement */ runtime} RetensiPolicy.source dipertahankan pada tingkat kode sumber dan ditinggalkan oleh kompiler (@Override adalah jenis ini); RetentionPolicy.class dipertahankan pada level file kelas yang dikompilasi oleh kompiler, tetapi dibuang oleh mesin virtual;
RetensiPolicy.
Lihat @Target:
Paket java.lang.annotation;/*** Menunjukkan konteks di mana jenis anotasi berlaku. * Konteks Deklarasi dan Konteks Jenis di mana jenis anotasi dapat * berlaku ditentukan dalam JLS 9.6.4.1, dan dilambangkan dalam kode sumber dengan enum * konstanta java.lang.annotation.elementType * @since 1.5 * @jls 9.6.4.1 @target * @jls 9.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7. */@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 [] ();}@Target digunakan untuk meminta penggunaan anotasi ini, dan nilainya:
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 * @since 1.8 */ type_parameter,/ ** * Penggunaan tipe * @since 1.8 */ type_use}Menunjukkan di mana anotasi ini dapat digunakan secara terpisah: 1) kelas, antarmuka, anotasi, enum; 2) domain atribut; 3) metode; 4) parameter; 5) konstruktor; 6) variabel lokal; 7) Jenis Anotasi; 8) Paket
Jadi:
@Target (elementType.method) @retention (retentionpolicy.source) public @interface override {}Ini berarti bahwa @Override hanya dapat digunakan pada metode, dipertahankan pada tingkat kode sumber, diproses oleh kompiler, dan kemudian dibuang.
Ada juga anotasi meta yang sering digunakan @Documented:
/** * menunjukkan bahwa anotasi dengan jenis harus didokumentasikan oleh Javadoc * dan alat serupa secara default. Jenis ini harus digunakan untuk membubuhi keterangan * Deklarasi jenis yang anotasinya mempengaruhi penggunaan elemen yang dianotasi oleh klien mereka. Jika deklarasi tipe dianotasi dengan * didokumentasikan, anotasi menjadi bagian dari API publik * dari elemen yang dianotasi. */@Didokumentasikan@retensi (retentionpolicy.runtime) @target (elementType.annotation_type) public @interface didokumentasikan {}Menunjukkan apakah anotasi dapat diproses oleh Javadoc dan disimpan dalam dokumen.
2. Kustomisasi dan proses anotasi khusus dengan anotasi meta
Dengan anotasi meta, saya dapat menggunakannya untuk menyesuaikan anotasi yang kita butuhkan. Menggabungkan anotasi khusus dan AOP atau filter adalah senjata yang sangat kuat. Misalnya, anotasi dapat digunakan untuk mencapai kontrol izin berbutir halus - gunakan anotasi izin pada kelas atau metode, dan kemudian mencegatnya dalam AOP atau filter. Berikut adalah implementasi anotasi tentang izin login:
/*** Tidak ada anotasi login yang diperlukan*/@target ({elementType.method, elementType.type})@retention(retentionpolicy.runtime)@documentedpublic @interface nologin {}Kami memiliki anotasi khusus @nologin, yang dapat digunakan pada metode dan kelas. Anotasi dipertahankan sampai runtime dan dapat dibaca dengan refleksi. Arti anotasi ini adalah: kelas atau metode yang dianotasi oleh @nologin dapat diakses bahkan jika pengguna tidak masuk. Berikut ini adalah proses anotasi:
/*** Periksa Login Interceptor* Jika Anda tidak perlu memeriksa login, Anda dapat menambahkan @nologin ke metode atau pengontrol*/kelas publik checkLoginInterceptor mengimplementasikan handlerinterceptor {private static Logger Logger = Logger.getespressePRESPRETSECPOR.CLASS); @override Public PREDEVESSEPSREPSEPREPSEPTOR.CLASS); @override Public PREDEPREPSEPREPSEPREPSEPPRECTECREST.CLASSEPREST.CLASS); @Override Public PREDEPRESSEPREPSEPREPSEPREST (HERPONSREPRECSECTOR.CLASS); Object handler) throws Exception {if (!(handler instanceof HandlerMethod)) {logger.warn("The current operation handler is not HandlerMethod=" + handler.getClass().getName() + ",req=" + request.getQueryString());return true;}HandlerMethod handlerMethod = (HandlerMethod) handler;String methodName = handlermethod.getMethod (). getName (); // Tentukan apakah Anda perlu memeriksa login nologin = handlermethod.getMethod (). getannotation (nologin.class); if (null! = nologin) {if (logger.isdebugeNabled ()) {logger.debug ("MethodName Operasi saat ini =" + MethodName + "Tidak perlu memeriksa login");} return true;} nologin = handlermethod.getMethod (). getDeclaring (). if (null! = nologin) {if (logger.isdebugeNabled ()) {logger.debug ("Operasi Metode saat ini =" + MethodName + "Tidak perlu memeriksa login");} return true;} if (null == request.getsession (). Getattribute (CommonConStants.sesesion "null == {getGibute (commonConSession {null = "Pengguna tidak masuk, ip =" + request.getRemoTeAddr ()); response.getWriter (). Tulis (jsonConverTor.convertFailResult (errorCodeEnum.not_login) .toString ()); // kembalikan pesan kesalahan false;} return true;}@void@override publice publice coup override POULDING POBULAH POBULAH COUPTHANDIDEW HTTPServLETRESPONSE Respons, Object Handler, ModelAndView ModelAndView) melempar Exception {} @Override public void AfterCompletion (httpservletRequest Request, httpservletResponse response, Object Handler, Exception Ex) melakukan pengecualian {}}Di atas kami mendefinisikan pencegat login, pertama menggunakan refleksi untuk menentukan apakah metode ini dianotasi oleh @nologin:
Nologin nologin = handlermethod.getMethod (). Getannotation (nologin.class);
Kemudian tentukan apakah kelas dijelaskan oleh @nologin:
nologin = handlermethod.getMethod (). getDeclaringclass (). getannotation (nologin.class);
Jika beranotasi, ia kembali benar. Jika tidak dijelaskan, ditentukan apakah telah masuk. Jika tidak masuk, ia mengembalikan pesan kesalahan ke latar depan dan salah. Ini adalah contoh sederhana menggunakan anotasi dan filter untuk pemrosesan izin. Jika kami memperluas, kami dapat menggunakan anotasi untuk menunjukkan bahwa metode atau kelas tertentu hanya dapat diakses oleh pengguna dengan peran atau izin tertentu, dan kemudian menilai dalam filter.
3. Anotasi yang terkait dengan Kontainer Kacang Musim Semi
1) @Autowired adalah anotasi yang paling kami gunakan. Faktanya, AutoWire = BYTYPE adalah ketergantungan suntikan otomatis berdasarkan jenis (injeksi ketergantungan berbasis anotasi), yang dapat digunakan dalam domain, metode, dan konstruktor.
2) @Qualifier adalah autowire = byname. Ketika anotasi @Autowired menentukan bahwa beberapa jenis kacang adalah sama, Anda perlu menggunakan @Qualifier ("xxbean") untuk menentukan ID kacang dependen:
@Controller @requestMapping ("/user") kelas publik HelloController {@Autowired @qualifier ("UserserService") UserServerService UserService Private;3) @Resource milik standar JSR250 dan digunakan dalam domain dan metode. Ini juga merupakan injeksi ketergantungan dari jenis nama. Metode Penggunaan: @Resource (name = "xxbean"). @Resource tanpa parameter nama kelas nilai default memiliki huruf kecil.
4) Anotasi dalam JSR-330 JAVAX. @Inject setara dengan @Autowired, @named setara dengan @qualifier, dan @named juga digunakan di kelas sebagai @Component.
5) @Component, @Controller, @Service, @Repository, anotasi ini berbeda dari anotasi di atas. Anotasi di atas disuntikkan ke dalam kacang yang tergantung, dan fungsi anotasi ini adalah untuk menghasilkan kacang. Anotasi ini dianotasi di kelas, menganotasi kelas menjadi kacang satu per satu di pabrik kacang musim semi. @Controller, @service, @repository pada dasarnya @Component dengan semantik yang lebih halus.
6) @PostConstruct dan @predestroy tidak digunakan untuk injeksi ketergantungan, tetapi untuk siklus hidup kacang. Mirip dengan metode init-method (incializeingBean) (DisposableBean)
4. Pemrosesan Anotasi di Musim Semi
Pemrosesan anotasi di musim semi pada dasarnya dilakukan dengan mengimplementasikan antarmuka beanpostprocessor:
antarmuka publik beanpostprocessor {objek postprocessBeforeInitialization (bean objek, string beanname) melempar beansException; Object PostProcessAntInitialization (Object Bean, String Beanname) melempar BeansException;}Kelas pemrosesan terkait adalah: AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor, PersistenceanNotationBeanPostProcessor, Diperlukan RanNotationBeanPostProcessor
Kelas pemrosesan ini dapat dikonfigurasi secara implisit ke dalam wadah musim semi melalui <konteks: anotasi-konfigurasi/>. Ini semua adalah pemrosesan injeksi ketergantungan, serta pemrosesan anotasi kacang produksi (@component, @controller, @service, @repository):
<konteks: komponen-scan-package = "net.aazj.service, net.aazj.aop" />
Ini dilakukan dengan menentukan jalur paket dasar yang dipindai, memindai mereka ke dalam wadah kacang musim semi. Perhatikan bahwa konteks: Component-scan juga akan mengkonfigurasi AutoWirirEnnotationBeanPostProcessor dan CommonAnnotationBeanPostProcessor secara default. Oleh karena itu <konteks: anotasi-konfigurasi/> dapat dihilangkan. Selain itu, konteks: Component-scan juga dapat memindai anotasi AOP gaya @Aspect, tetapi perlu untuk menambahkan <aop: aspekj-autoproxy/> ke file konfigurasi untuk kerja sama.
5. Perbedaan antara Anotasi Musim Semi dan Anotasi Standar JSR-330:
Meringkaskan
Di atas adalah tentang pemahaman dengan cepat berbagai anotasi di musim semi. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!