Daftar isi
1. Spring AOP berdasarkan konfigurasi XML
2. Gunakan anotasi untuk mengonfigurasi AOP
3. Fungsi Point-Cut Aspek
4. Catatan Pemberitahuan Aspek
5. Konfigurasi Nol untuk Menerapkan IOC Spring dan AOP
AOP (Pemrograman Berorientasi Aspek) adalah teknologi yang mengimplementasikan kontrol multi-modul horizontal yang disatukan dari fungsi program melalui metode prekompilasi dan agen dinamis selama runtime. AOP adalah suplemen untuk OOP dan bagian penting dari kerangka kerja musim semi. Berbagai bagian logika bisnis dapat diisolasi dengan menggunakan AOP, sehingga mengurangi kopling antara berbagai bagian logika bisnis, meningkatkan penggunaan kembali program, dan meningkatkan efisiensi pengembangan. AOP dapat dibagi menjadi tenun statis dan menenun dinamis. Tenun dinamis tidak memerlukan mengubah modul target. Spring Framework mengimplementasikan AOP, dan menggunakan anotasi untuk mengonfigurasi AOP lebih nyaman dan intuitif daripada menggunakan konfigurasi XML.
1. Spring AOP berdasarkan konfigurasi XML
Sebelum menjelaskan anotasi untuk mengimplementasikan fungsi AOP, pertama -tama gunakan pembelajaran sebelumnya untuk mengonfigurasi fungsi pegas AOP menggunakan XML, sehingga untuk perbandingan dan pemahaman yang lebih baik.
1.1. Buat proyek Maven baru dan tambahkan referensi.
<Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" schemalocation = "http:/maven.apache.aPA G/XSD/MAVEN-4.0.0.XSD "> <ModelVersion> 4.0.0 </ModelVersion> <GroupId> com.zhangguo </groupid> <ArTifactId> spring052 </sartifactid> <version> 0.0.1-Snapshot </version> <packaging> Jar </packaging> <name> spring052 </name> <rerl> http://maven.apache.org </rumry> <po project.build.sourceencoding> UTF-8 </URLT.Build.Build.sourceCoding> UTF-8 </proect.build.build /Properties> <Dependencies> <dependency> <GroupId> JUnit </GroupId> <ArTifactId> junit </artifactid> <scope> tes </seupop> <version> 4.10 </version> </dependency> <dependency> <groupId> org.springframework </groupid> <ArtifactId> Spring-Context </arttifactid> <version> $ {spring.version} </version> </depgerid> <roGRUPID> <ROMPROGID> <ROMPROGED> <ROMPROGED> <RUPTER> Ketergantungan> <dependency> <GroupId> CGLIB </groupid> <ArTifactId> CGLIB </artifactid> <version> 3.2.4 </version> </dependency> </dependencies> </project>1.2. Buat kelas matematika yang akan diajukan, kodenya adalah sebagai berikut:
Paket com.zhangkuo.spring052.aop01;/*** Target kelas yang diproklikan*/kelas publik {// tambahkan int tambahan (int n1, int n2) {int result = n1+n2, non-n2; System.Out.Println (N1+"-"+N2+"="+Hasilnya); Hasil = N1*N2;1.3. Edit Kode Kelas Pemberitahuan. Kode Java yang perlu digunakan di AOP adalah sebagai berikut:
package com.zhangguo.Spring052.aop01;import org.aspectj.lang.JoinPoint;/** * Notification class, cross-cut logic* */public class Advices { public void before(JoinPoint jp){ System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------1.4.
<? XML Versi = "1.0" Encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: ppmlns: pp ingframework.org/schema/p "xmlns: aop =" http://www.springframework.org/schema/aop "xsi: schemalocation =" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-leans.xsd http://www.spramework.org/schema/aop http:/www.spramework.org/schaMaMema/aop op -4.3.xsd "> <!-Objek proxy-> <bean id =" math "> </ bean> <!-notification-> <bean id =" advices "> </ bean> <!-aop configuration-> <aop: config proxy-class =" true "> <!-section-> <aop: point ref =" point-class = "true"> <!-section-> <aop: aspect ref = "point-class =" true "> <!-Section-Section-aOP: APOP Ref Ekspresi = "Eksekusi (* com.zhangkuo.spring052.aop01.math.* (..))" id = "pointcut1"/> <!-Metode pemberitahuan dan point-cut-> <aop: sebelum metode = "sebelum" pointcut = "pointcut1"/<aop: setelah metode = "setelah" pointcut = "pointcut1"/<aOP: setelah metode = "setelah" pointcut = "pointcut1"/<aOP: after "after" pointcut = "pointc: pointcut1" " >
1.5.
Paket com.zhangkuo.spring052.aop01; impor org.springframework.context.applicationContext; Impor org.springframework.context.support.support.classpathxmlicationContext; public class {public static void Main (string [] argsmlicationContext; public class {public static void Main (string [] argsmlicationContext (public class {public static void Main (string [] argsmlication ml "); matematika matematika = ctx.getbean (" matematika ", matematika.class); int n1 = 100, n2 = 5; Math.Add (N1, N2);Hasil Menjalankan:
2. Gunakan anotasi untuk mengonfigurasi AOP
2.1. Dalam contoh sebelumnya, memodifikasi matematika kelas proxy. Ini setara dengan menambahkan kacang ke file konfigurasi XML dalam contoh sebelumnya, <!-objek proxy-> <bean id = "matematika"> </ bean>, dan kode kelas matematika adalah sebagai berikut:
Paket com.zhangkuo.spring052.aop02; Impor org.springframework.stereotype.service;/*** Kelas target yang diproklikan*/@layanan ("matematika"), N1; // gantikan int int sub (int n1, int n2) {int result = n1-n2; System. println (n1+"/"+n2+"="+hasil pengembalian;2.2.
Paket com.zhangguo.spring052.aop02; impor org.aspectj.lang.joinpoint; impor org.aspectj.lang.annotation.aspect; Impor org.aspectj.Lang.Annotation. /@Component@aspectpublic class advices {@before ("eksekusi (* com.zhangguo.Spring052.aop02.Math.*(..))") public void before(JoinPoint jp){ System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Kode di atas pada dasarnya sama dengan konfigurasi berikut
<!-Pemberitahuan-> <bean id = "Advices"> </bean> <!-AOP Configuration-> <aop: config proxy-target-class = "true"> <!-bagian-> <aop: aspek ref = "nasihat". /> <!-Hubungkan metode dan titik pemberitahuan-> <aop: sebelum metode = "sebelum" pointcut-ref = "pointcut1"/> <aop: after method = "after" pointcut-ref = "pointcut1"/> </aop: aspek> </aop: config>
2.3. Menambahkan file konfigurasi AOP02.XML, dan menambahkan AOP: Aspekj-Autoproxy Node berdasarkan mengkonfigurasi IOC.
<? XML Versi = "1.0" Encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: ppmlns: pp ingframework.org/schema/p "xmlns: aop =" http://www.springframework.org/schema/aop "xmlns: context =" http://www.springframework.org/schema/context " XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.wwwa.springframework.org. skema/konteks/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd "> <konteks: komponen-scan-package = "com.zhangkuo.spring052.aop02"> </konteks: komponen-scan> <aop: aspekj-autoproxy proxy-target-class = "true"> </aop: aspekj-autoproxy> </beans>
2.4.
Paket com.zhangkuo.spring052.aop02; impor org.springframework.context.appLicationContext; impor org.springframework.context.support l "); matematika matematika = ctx.getbean (" matematika ", matematika.class); int n1 = 100, n2 = 5; Math.Add (N1, N2);Hasil Menjalankan:
3. Fungsi Point-Cut Aspek
Fungsi tangen dapat diposisikan ke posisi logis transversal yang akurat. ing.
@AspectJ menggunakan ekspresi poin khusus AspectJ untuk menggambarkan bagian ini.
Metode Fungsi Point-Cut: Menentukan titik koneksi dengan menjelaskan informasi metode kelas target.
Metode Fungsi Point-Cut Parameter: Menentukan titik koneksi dengan menjelaskan informasi parameter dari metode kelas target.
Fungsi titik-potong kelas target: Menentukan titik koneksi dengan menjelaskan informasi jenis kelas target.
Fungsi Point-Cut Kelas Agen: Menentukan titik koneksi dengan menjelaskan informasi kelas proxy.
Fungsi Ekspresi Aspek Umum:
Fungsi titik-potong yang paling umum digunakan adalah: Eksekusi (<Mode Modifier>? <Mode Jenis Pengembalian> <Metode Nama Mode> (<Mode Parameter>) <Mode Pengecualian>?) Fungsi Point-Cut, yang dapat memenuhi sebagian besar kebutuhan.
Untuk menunjukkan fungsi dari setiap fungsi tangen, strutil kelas baru sekarang ditambahkan, kelasnya adalah sebagai berikut:
Paket com.zhangkuo.spring052.aop03; impor org.springframework.stereotype.component; @component ("Strutil") Public Class Strutil {public void show () {System.out.println ("Hello Strutil!");Kode tes adalah sebagai berikut:
Paket com.zhangkuo.spring052.aop03; impor org.springframework.context.applicationContext; Impor org.springframework.context.support.support.classpathxmlicationContext; public class {public static void Main (string [] arglication l "); iMath Math = ctx.getBean (" Math ", Math.class); int n1 = 100, n2 = 5; Math.add (N1, N2);3.1.
Paket com.zhangkuo.spring052.aop03; impor org.aspectj.lang.joinpoint; impor org.aspectj.lang.annotation.aspect; impor org.aspectj.lang.annotation. /@Component@aspectpublic class advices {@before ("eksekusi (* com.zhangkuo.spring052.aop03.math.*(..) ") public void Sebelumnya (joinpoint jp) {System.out.println (" ----------------------------- ");} // Execution (JP.GetSignature () Paket dipotong menjadi @After ("Eksekusi (*com.zhangkuo.spring052.aop03.*.*(..))") batal public setelah (joinpoint jp) { System.out.println ("-----------------------------------");Hasil operasi adalah sebagai berikut:
Eksekusi (<Mode Modifier>? <Mode Jenis Pengembalian> <Metode Nama Mode> (<Mode Parameter>) <Mode Pengecualian>?)
3.2.
// dalam fungsi point-cut // com.zhangkuo.spring052.aop03 Paket Semua metode dari semua kelas dipotong menjadi @after ("di dalam (com.zhangguo.spring052.aop03.*)") Kampung public after (gantinya JP) {out.out.aop03 ("---------3.3
//this point-cut function//Implements any connection point of the proxy object of the IMath interface @After("this(com.zhangguo.Spring052.aop03.IMath)") public void after(JoinPoint jp){ System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------3.4
//args point-cut function//Requires that the method has two int type references before it will be weaved into the cross-cutting logic @After("args(int,int)") public void after(JoinPoint jp){ System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Jika jenis parameter bukan tipe data dasar, nama paket diperlukan.
3.5
Pertama kali menyesuaikan anotasi yang dapat dijelaskan pada metode ini
Paket com.zhangkuo.spring052.aop03; impor java.lang.annotation.Documented; impor java.lang.annotation.elementtype; impor java.Lang.annotation. Retentionpolicy.runtime) @documentedpublic @interface myanno {} //@Annotation Point-Cut Function // Memerlukan metode ini harus dianotasi com.zhangkuo.spring052.aop03.myanno untuk ditenun ke dalam logika pemotongan transversal @after ("@@annotation (com.zhangguo.spring052.aop03.myanno) (com.zhangguo.spring052.aop03.myanno)") (com.zhanggu.spring052.aop03. } Paket com.zhangkuo.spring052.aop03; impor org.springframework.stereotype.component; @component ("strutil") strutil kelas publik {@myanno public void show () {System.out.println ("Hello Strutil!");Hasil Menjalankan:
Fungsi pemotongan titik lainnya dengan @ adalah untuk anotasi
4. Catatan Pemberitahuan Aspek
Anotasi pemberitahuan aspek memiliki 6, 5 umumnya digunakan, dan lebih sedikit perkenalan digunakan.
Pertama -tama selesaikan masalah mendefinisikan multiplexing titik tangen, seperti yang ditunjukkan pada kode berikut, konten fungsi garis singgung persis sama:
Paket com.zhangkuo.spring052.aop04; impor org.aspectj.lang.joinpoint; impor org.aspectj.lang.annotation.aspect; Impor org.aspectj.Lang.Annotation. /@Component@aspectpublic class advices {@before ("eksekusi (* com.zhangguo.Spring052.aop04.Math.*(..))") public void before(JoinPoint jp){ System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Anda pertama -tama dapat mendefinisikan garis singgung dan kemudian multipleks sebagai berikut:
Paket com.zhangkuo.spring052.aop04; impor org.aspectj.lang.joinpoint; impor org.aspectj.lang.annotation.aspect; Impor org.aspectj.Lang. /@Component@aspectpublic class advices { // 切点 @pointcut ("Eksekusi (* com.zhangkuo.spring052.aop04.math.* (..)") public void pointcut () {} @before ("pointcut ()" sebelumnya (前置通知 前置通知 前置通知 {前置通知 前置通知 {前置通知 {前置通知 @ ());} @After ("pointcut ()") public void after (joinpoint jp) { System.out.println ("-----------------------------------");Ubah file Advices.java dan tambahkan berbagai jenis pemberitahuan sebagai berikut:
Paket com.zhangkuo.spring052.aop04; impor org.aspectj.lang.joinpoint; impor org.aspectj.lang.proedingjointpoint; impor org.aspectj.langReturning. annotation.around; impor org.aspectj.lang.annotation.around; impor org.aspectj.lang.annotation.aspect; impor org.aspectj.lang.annotation.before; impor; org.aspectj.lang.annotation.pointcut; impor org.springframework.stereotype.component;/*** Kelas pemberitahuan, logika silang*/@komponen@aspectpublic class advices {// point @pointcut ("com.zhangguo.spring052.aop (* com.zhangguo.spring052.aop Otice @before ("pointcut ()") public void Sebelumnya (joinpoint jp) { System.out.println (jp.getSignature (). GetName ()); ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Throwable {System.out.println (pjp.getSignature (). GetName ()); --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- AfterReturning (JPPoint JP, Hasil Objek) {System.out.println (JP.GetSignature (). GetName ()); --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- System.out.println (JP.GetSignature (). GetName ());Hasil Menjalankan:
5. Konfigurasi Nol untuk Menerapkan IOC Spring dan AOP
Untuk mencapai konfigurasi nol, berdasarkan contoh asli, kami menambahkan kelas seperti pengguna baru seperti yang ditunjukkan di bawah ini:
Paket com.zhangkuo.spring052.aop05; pengguna kelas publik {public void show () {System.out.println ("Objek pengguna");Kelas ini tidak beranotasi dan wadah tidak akan dikelola secara otomatis. Karena tidak ada file konfigurasi XML, gunakan satu sebagai informasi konfigurasi, dan file applicationcfg.java adalah sebagai berikut:
Paket com.zhangkuo.spring052.aop05; impor org.springframework.context.annotation.bean; impor org.springframework.context.annotation.notation Iguration // Kelas Konfigurasi Digunakan untuk mewakili kelas saat ini sebagai wadah, mirip dengan <beans/>@componentscan (Basepackages = "com.zhangkuo.spring052.aop05") // Kisaran pemindaian setara dengan simpul konfigurasi XML <konteks: komponen-scan/>@enableaspectjautoproxy (proxytargetclass = true) // proxy auto-class-target-class = {aoppproxy-classJ: aopproxy proxy-target-class = , setara dengan <bean id = getUser/> @Bean User getUser () {return new user ();Setiap bagian dari kelas ini pada dasarnya memiliki hubungan satu-ke-satu dengan konfigurasi XML. Kode tes adalah sebagai berikut:
Paket com.zhangkuo.spring052.aop05; impor org.springframework.context.applicationContext; impor org.springframework.context.annotation.annotationConfigLicationContext; ) {// inisialisasi kontainer melalui kelas aplikasicontext ctx = baru AnnotationConfigappLicationContext (ApplicationCfg.class); user = ctx.getbean ("getUser", user.class); Advices.java sama seperti di atas, tanpa perubahan, hasil berjalan adalah sebagai berikut:
Di atas adalah semua konten artikel ini.