1. Catatan
Anotasi adalah mekanisme yang mirip dengan anotasi. Menambahkan anotasi dalam kode dapat menggunakan informasi ini pada beberapa waktu kemudian. Tidak seperti komentar, komentar untuk kita lihat. Mesin virtual Java tidak dapat dikompilasi, dan anotasi tidak dikompilasi, tetapi kita dapat membaca informasi dalam anotasi melalui mekanisme refleksi. Anotasi menggunakan kata kunci @interface, mewarisi java.lang.annotition.annotation
1. Anotasi di Javase
Izinkan saya memberi Anda contoh untuk meninjau anotasi apa itu di Javase. Kuncinya adalah dua poin: definisi anotasi dan bagaimana mendapatkan informasi di atas anotasi melalui refleksi.
1. Pertama mendefinisikan dua anotasi. Satu adalah classInfo beranotasi di kelas, dan yang lainnya adalah MethodInfo beranotasi pada metode ini.
Classinfo
Paket com.itheima10.annotation; impor java.lang.annotation.dokumen; impor java.lang.annotation.elementtype; impor java.lang.annotation.retention; import java. target. Kelas @retention (retentionpolicy.runtime) // di java, file kelas dan anotasi runtime @documented // dapat dihasilkan dalam dokumen bantuan public @interface classInfo { /** * anotasi ini memiliki dua properti tipe string * @return * /string name () default ""; String value () default "";}MethodInfo
Paket com.itheima10.annotation; impor java.lang.annotation.Documented; impor java.lang.annotation.elementtype; impor java.lang.annotation.retensi; import java. target.annotation. pada metode @retention (retentionpolicy.runtime) // di java, file kelas dan anotasi runtime @documented // dapat dihasilkan dalam bantuan dokumen public @interface methodInfo { /*** anotasi ini memiliki dua properti tipe string* /string name () default ""; String value () default "";}2. Tulis kelas anotasi untuk menggunakan anotasi yang ditentukan di atas
paket com.itheima10.annotation; @classsinfo (name = "xiaopingguo118", value = "niu") kelas publik annotationuse {@methodinfo (name = "java", value = "Spring Framework penting") public void java () {}}3. Tuliskan Kelas Tes AnnotationTest dan parse properti di atas dua anotasi
Paket com.itheima10.annotation; import java.lang.reflect.method; impor org.junit.test; kelas publik annotationtest {public static void test () { / ** * Jika parse anotasi kelas, dapatkan Kelas * jika parse anotasi metode, dapatkan metode pertama * // menilai apakah ada anotasi classInfo di kelas IF (class1.isannotationPresent (classInfo.class)) {// Dapatkan anotasi pada classclasssinfo classInfo = (classInfo) class1.getannotation (classinfo.class); System.out.println (classInfo.value ()); System.out.println (classInfo.name ()); } Metode [] Metode = class1.getMethods (); untuk (metode metode: metode) {// Apakah ada anotasi MethodInfo pada metode yang sedang dilintasi if (method.isannotationPresent (methodInfo.class)) {methodInfo methodInfo = method.getAnnotation (methodInfo.class); System.out.println (MethodInfo.name ()); System.out.println (MethodInfo.Value ()); }}} @Test public void test () {annotationTest.test (); }}2. Anotasi di Musim Semi
Kerangka kerja musim semi memberi kami fungsi anotasi.
Menggunakan pemrograman anotasi terutama untuk menggantikan file XML dan membuat pengembangan lebih cepat. Namun, penggunaan file XML adalah untuk menyelesaikan masalah memodifikasi kode sumber program. Sekarang saya tidak menggunakan file XML, bukankah itu melanggar prinsip pembukaan dan penutupan? Itu benar. Namun, anotasi juga bagus, jadi Anda tidak perlu mengkonfigurasi begitu banyak file XML saat menggunakan anotasi. Yang paling penting adalah mereka memiliki efisiensi perkembangan tinggi. .
Ketika tidak ada anotasi yang digunakan, banyak tag <Bean> yang perlu dikonfigurasi dalam file konfigurasi ApplicationContext.xml file kerangka kerja Spring untuk mendeklarasikan objek kelas. Menggunakan anotasi, Anda tidak perlu menambahkan tag menarik dalam file konfigurasi, dan deskripsi yang sesuai adalah untuk menambahkan instruksi dalam posisi "komentar" dari kelas yang sesuai. Pendahuluan spesifik adalah sebagai berikut:
• 1. Kombinasi hubungan antara objek @Resource , standarnya adalah untuk berkumpul dengan nama. Jika objek terkait tidak dapat ditemukan berdasarkan nama, maka jenis pencarian berdasarkan jenis akan dilanjutkan. Jika tidak ada atribut nama yang ditentukan,
• Ketika anotasi ditandai pada bidang, standarnya adalah mengambil nama bidang sebagai nama kacang untuk menemukan objek dependensi
• Ketika anotasi ditandai pada metode setter atribut, nama atribut default diambil sebagai nama kacang untuk menemukan objek ketergantungan.
• Catatan: Jika atribut nama tidak ditentukan dan objek ketergantungan tidak dapat ditemukan secara default, anotasi @Resource jatuh kembali ke perakitan berdasarkan jenis. Tetapi begitu atribut nama ditentukan, itu hanya dapat dirakit dengan nama.
• 2. @Autowired
@Autowired dirakit berdasarkan jenis secara default, @Resource dirakit dengan nama secara default, dan hanya ketika kacang yang cocok dengan nama tidak dapat ditemukan akan dirakit berdasarkan jenis. Solusinya adalah merakit objek dependen berdasarkan jenis. Secara default, itu membutuhkan objek dependen untuk ada. Jika nilai nol diperbolehkan, itu dapat diatur ke false.
• 3. @Qualifier
Jika kita ingin menggunakan perakitan dengan nama, kita dapat menggunakannya bersamaan dengan anotasi @Qualifier.
1. Untuk menggunakan anotasi, Anda perlu menambahkan langkah -langkah file namespace dan kendala ke file konfigurasi:
Memperkenalkan konteks namespace
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance"
xmlns: context = "http://www.springframework.org/schema/context"
...
http://www.springframework.org/schema/context/spring-context-2.5.xsd ">
2. Tambahkan konteks: tag anotasi-konfigasi ke file konfigurasi
<konteks: anotasi-konfigurasi> </konteks: anotasi-konfigasi>
Contoh demonstrasi:
Tulis kelas orang dengan atribut siswa dan metode say (). Kodenya adalah sebagai berikut
Paket com.itheima10.spring.di.annotation; import javax.annotation.resource; impor org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.qualtifier; type @kualifier ("siswa") * */orang kelas publik {@resource (name = "siswa") siswa swasta; public void mengatakan () {this.student.say (); }}Kode kelas siswa adalah sebagai berikut
paket com.itheima10.spring.di.annotation; siswa kelas publik {public void mengatakan () {System.out.println ("Student"); }}Konfigurasikan file applicationContext.xml
<? Xml Version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: context = "http://www.springframework.org/scema/www.spramework.org/scema/contpema/www.spramework.org/orgaMema/contpa/context" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://www.spramework.org/schema/beans http:/wwww.spramework.org/schema/beans http:/www.spramework.orgaMema http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <!-- Put person and student into spring container--> <bean id="person"></bean> <bean id="student"></bean> <!-- Introduce context namespace xmlns: context = "http://www.springframework.org/schema/context" http://www.springframework.org/schema/context http://www.springframework.org/context/sontext/www.springframework.org/contex Parser anotasi yang telah disuntikkan sejak dimulai-> <Context: Annotation-Config> </konteks: anotasi-konfigasi> </tobel>
Tulis Kelas Tes AnnotationTest
Paket com.itheima10.spring.di.annotation; impor org.junit.test; impor org.springframework.context.applicationContext; instan org.springframework.context.support.support. Kontainer musim semi diuraikan ke* <konteks: anotasi-konfigasi> </konteks: anotasi-konfigurasi>*, parser anotasi untuk injeksi ketergantungan akan dimulai* 4. Kontainer musim semi akan mencari di dalam lingkup biji yang termasuk dalam manajemen musim semi untuk melihat sifat-sifat mana dari kelas-kelas ini ditambahkan dengan @ressumbece*. Dari atribut nama anotasi adalah "" * jika itu "", itu akan cocok dengan nama atribut di mana anotasi berada dan nilai ID dalam wadah musim semi. Jika pertandingan berhasil, penugasan * jika pertandingan tidak berhasil, penugasan akan dilakukan sesuai dengan jenisnya. Jika pertandingan berhasil, penugasan akan ditugaskan * Jika pertandingan tidak berhasil, penugasan akan dilaporkan * Jika kecocokan tidak berhasil, penugasan akan dilaporkan secara langsung * jika pertandingan tidak berhasil, penugasan akan dilaporkan * jika kecocokan tidak berhasil, penugasan tidak berhasil secara langsung * jika kecocokan tidak berhasil, penugasan akan dilaporkan * jika tidak dapat dilaporkan. Jenis referensi XML dan anotasi. Efisiensi relatif tinggi. Menulis lebih merepotkan. Penulisan anotasi relatif sederhana dan kurang efisien * */kelas publik annotationTest {@test public void testannotation () {applicationContext context = new ClassPathXMLapPlicationContext ("ApplicationContext.xml"); Orang orang = (orang) context.getBean ("orang"); orang.say (); }}Jika Anda menggunakan anotasi, Anda tidak perlu memuat orang dan siswa dalam file konfigurasi, yang dapat menyederhanakan penulisan file konfigurasi.
3. Pindai
Dalam contoh sebelumnya, kami menggunakan definisi XML Bean untuk mengonfigurasi komponen. Dalam proyek yang sedikit lebih besar, biasanya ada ratusan komponen. Jika komponen -komponen ini dikonfigurasi menggunakan definisi XML Bean, itu jelas akan meningkatkan ukuran file konfigurasi, membuatnya tidak terlalu nyaman untuk menemukan dan memelihara. Spring2.5 memperkenalkan mekanisme pemindaian komponen otomatis untuk kami, yang dapat menemukan kelas yang dijelaskan dengan @Component, @Service, @Controller, dan anotasi @Repository di bawah ClassPath, dan memasukkan kelas -kelas ini ke dalam wadah musim semi untuk dikelola. Fungsinya sama dengan menggunakan komponen konfigurasi node kacang dalam file XML. Untuk menggunakan mekanisme pemindaian otomatis, kita perlu membuka informasi konfigurasi berikut:
1. Memperkenalkan namespace konteks
Tambahkan Konteks: Tag Komponen-Pemindaian dalam File Konfigurasi XML
Di mana paket dasar adalah paket (subpackage) yang perlu dipindai.
Contoh:
Contoh di atas ditulis dalam mode pemindaian sebagai berikut
@ComponentPublic Class Person {@resource (name = "siswa") Siswa swasta; public void mengatakan () {this.student.say (); }}@Componentpublic class student {public void mengatakan () {System.out.println ("Student"); }}ApplicationContext.xml hanya perlu dikonfigurasi dalam satu kalimat
<!-Komponen komponen menempatkan kelas ke dalam wadah pegas, dan kelas disebut pemindaian komponen di bawah paket dan subpackage yang ditentukan oleh paket dasar-> <konteks: komponen-pemindaian paket basa = "com.itheima10.spring.scan"> </konteks: komponen-scan>
Tulis Kelas Tes AnnotationTest
/*** Prinsip* 1. Mulai Kontainer Musim Semi* 2. Parsing Kontainer Musim Semi* <Konteks: Komponen-Pemindaian Basis-paket = "com.itheima10.spring.scan"> </konteks: komponen-scan> 3. Pindai public dan subpackage yang ditentukan oleh paket dasar untuk melihat kelas mana yang mengandung @component annotation 4. untuk <bean id = "orang"> @component ("aa") orang kelas publik {} == setara dengan <bean id = "aa"> 5. Ikuti langkah -langkah analisis @resource: seluruh proses dipindai dua kali, efisiensi lebih rendah dan lebih rendah, dan tulisannya menjadi lebih mudah dan lebih mudah * */Kelas Publik {Public {Public {Public {Public {Public {Public {Public {Public {Public {{Public {{Public lebih mudah dan lebih mudah { ClasspathxmlapplicationContext ("applicationContext.xml"); Orang orang = (orang) context.getBean ("orang"); orang.say (); }}Kemunculan Kembali Contoh
Kami akan mengubah sistem manajemen dokumen terakhir di item51 dalam anotasi. Antarmuka dokumen tetap tidak berubah, dengan metode baca dan tulis. Kelas implementasi adalah sebagai berikut ExcelDocument, PDFDocument, dan WordDocument.
@Component ("ExcelDocument") kelas publik ExcelDocument mengimplementasikan dokumen {public void read () {System.out.println ("Excel Read"); } public void write () {System.out.println ("Excel write"); }}@Component ("pdfdocument") kelas publik PDFDocument mengimplementasikan dokumen {public void read () {System.out.println ("PDF Read"); } public void write () {System.out.println ("PDF Write"); }}@Component ("WordDocument") Kelas publik WordDocument mengimplementasikan dokumen {public void read () {System.out.println ("Word Read"); } public void write () {System.out.println ("Word write"); }}DocumentManager
@Component ("DocumentManager") Kelas Publik DocumentManager {@resource (name = "ExcelDocument") dokumen dokumen pribadi; public void read () {this.document.read (); } public void write () {this.document.write (); }}File konfigurasi
<konteks: komponen-scan-package = "com.itheima10.spring.iocdi.document">
</konteks: komponen-scan>
Tulis DocumentTest kelas tes
public class documenttest {@test public void testDocument () {applicationContext context = new ClassPathXMLapPlicationContext ("ApplicationContext.xml"); DocumentManager DocumentManager = (DocumentManager) Context.getBean ("DocumentManager"); DocumentManager.read (); DocumentManager.write (); }} 2. Pengantar fungsi anotasi lainnya
@Service digunakan untuk memberi anotasi komponen lapisan bisnis dan anotasi lapisan layanan
@Controller digunakan untuk membubuhi nama komponen lapisan kontrol (seperti tindakan di struts) dan anotasi lapisan kontrol
@Repository digunakan untuk menganotasi komponen akses data, mis. Komponen DAO. Anotasi Lapisan Kegigihan
@Component mengacu pada komponen. Ketika komponen tidak mudah diklasifikasikan, kita dapat menggunakan anotasi ini untuk membuat anotasi.
Contoh mereproduksi kasus MVC
Kami meninjau kasus -kasus MVC di item51 lagi, menambahkan lapisan DAO, layanan, dan tindakan persondaoImpl, kepribadian, dan PersonserviceImpl untuk menambahkan anotasi ke lapisan DAO, layanan, dan tindakan persondaoImpl.
@Repository ("persondao") kelas publik persondaoImpl mengimplementasikan persondao {@override public void saveperson () {System.out.println ("Save Person"); }} @Service ("Personservice") Public Class PersonserviceImpl mengimplementasikan Personservice {@resource (name = "persondao") persondao persondao pribadi; public void setpersondao (persondao persondao) {this.persondao = persondao; } @Override public void saveperson () {this.persondao.saveperson (); }} @Controller ("Personalaction") Public Class Personalction {@Resource (name = "Personservice") Private Personservice Personservice; public void setpersonservice (Personservice Personservice) {this.personservice = Personservice; } public void saveperson () {this.personservice.saveperson (); }}Tulis tes mvctest
kelas publik mvctest {@test public void testMvc () {applicationContext context = new ClassPathXMLapPlicationContext ("ApplicationContext.xml"); Personalcaction Personalction = (Persamaan) Context.getBean ("Persamaan"); fedoaction.saveperson (); }}4. Warisan di Musim Semi
Spring mendukung warisan, yang dapat dibagi menjadi warisan kelas dan atribut warisan.
1. Warisan kelas
Properti Musim Semi:
(1) Abstrak: Jika diatur ke true, itu berarti bahwa kacang yang ditentukan adalah abstrak, beri tahu musim semi untuk tidak membuat instantiate kacang;
Pertanyaan: Haruskah ini kelas abstrak? Mungkinkah itu kelas abstrak?
(2) orang tua: menunjukkan fungsi ID kacang pada kacang, yang setara dengan fungsi meluas pada kelas Java;
Adegan: Ada tiga kacang:
<bean id = "bean1" class = "... testbean"> <name properti = "sex" value = "laki -laki"/> </bean> <bean id = "bean2" class = "... testbean"> <nama properti = "sex" value = "laki -laki"/> </bean "<bean id =" bean3 "class =" estbean "> </bean = name =" bean = "bean3" class = "uji"> </bean = "name =" name = "bean3" class = "lean"> </bean = "name =" name = "bean3" class = "class =" testbean "> </bean =" name = "name =" name = "a nilai"/a nilai = "bean =" bean "class =" lean "uji">
Modifikasi: Tentukan kacang induk musim semi
<bean id = "Basebean" class = "… testbean"> <name properti = "sex" value = "pria"/> </ bean>
Tentukan subbeans
<bean id = "bean1" parent = "Basebean"/> mewarisi sifat -sifat kacang induk <bean id = "bean2" parent = "Basebean"/> <bean id = "bean3" Parent = "Basebean"> menimpa properti dari kacang induk <nama properti = "seks" nilai = "betina"/</bean>
Kacang anak dapat mewarisi sifat kacang induk atau mengesampingkan sifat kacang induk.
2. Atribut warisan
Ada atribut yang sama antara beberapa kacang yang berbeda, dan pemandangannya dapat diekstraksi:
<bean id = "bean1" class = "... atestbean"> <properti name = "sex" value = "pria"/> <name properti = "tugas" ref = "tugas"/> </ bean> <bean id = "bean2" class = "... btestbean"> <nama properti = "seks" value = "jantan"/</bean>
Modifikasi: (1) Ekstrak atribut publik
<bean id = "basisex" abstrak = "true"> <name properti = "sex" value = "pria"/> </bean>
(2) Modifikasi kacang
<bean id = "bean1" class = "... atestbean" Parent = "basisex"> <name properti = "tugas" ref = "Tugas"/> </ bean> <bean id = "bean2" class = "... btestbean" Parent = "basisex"//>
Di sini kacang memiliki atribut induk dan kelas, dan basisx yang ditunjuk oleh orang tua adalah untuk memungkinkan kacang yang berbeda untuk berbagi nilai atribut yang sama; Ketika TransactionProxyFactoryBean menyatakan layanan, warisan atribut kacang dapat secara signifikan mengurangi konfigurasi XML yang berlebihan.
Warisan berbasis anotasi tidak memerlukan atribut induk.
Mari kita memiliki gambar ringkasan kecil terakhir
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.