Artikel ini memperkenalkan metode penggunaan AOP dalam proyek Springboot. Saya akan membaginya dengan Anda. Dengan rincian sebagai berikut:
1. Ikhtisar
Menggunakan logika umum untuk mengimplementasikan teknologi AOP dapat sangat menyederhanakan penulisan program, seperti verifikasi tanda tangan, otentikasi, dll. Transaksi deklaratif Spring juga diimplementasikan melalui teknologi AOP.
Untuk kode tertentu, silakan merujuk ke contoh proyek https://github.com/qihaiyan/springcamp/tree/master/spring-aop
Teknologi AOP Spring memiliki empat konsep inti:
Pointcut: Point Cut, digunakan untuk mendefinisikan metode mana yang akan dicegat, misalnya eksekusi (*cn.springcamp.springaop.service.*.*(..))
Saran: Tindakan yang akan dieksekusi setelah mencegat metode ini
Aspek: Iris, gabungkan pointcut dan saran bersama untuk membentuk permukaan yang dipotong
Bergabunglah dengan: Sebuah instance pointcut selama eksekusi
Weaver: Kerangka kerja untuk mengimplementasikan AOP, seperti AspectJ atau Spring AOP
2. Definisi Definisi Definisi
Definisi pointcut yang umum digunakan termasuk eksekusi dan @annotation. Eksekusi mendefinisikan metode bebas metode dan digunakan untuk mengimplementasikan bagian yang relatif umum. @Annotation dapat ditambahkan sebagai anotasi ke metode tertentu, seperti anotasi transaksi Spring.
Definisi titik-potong eksekusi harus ditempatkan di kelas publik untuk mengelola definisi titik pemotongan secara terpusat.
Contoh:
kelas publik commonjoinpointconfig {@pointcut ("eksekusi (*cn.springcamp.springaop.service.*.*(..))") public void serviceLayerExecution () {}}Dengan cara ini, di kelas aspek tertentu, Anda dapat merujuk pada titik tangen melalui CommonjoinPointConfig.servicelayerExecution ().
kelas publik befeaspect {@before ("commonjoinPointConfig.servicelayerExecution ()") public void sebelumnya (gabungan joinpoint) {System.out.println ("---------------> Sebelum aspek"); System.out.println ("-----------------> Sebelum Eksekusi" + JoinPoint); }}Ketika titik tangen perlu diubah, Anda hanya perlu memodifikasi kelas CommonJoINPointConfig, tanpa memodifikasi setiap kelas aspek.
3. Pemotongan wajah yang biasa digunakan
Sebelum: Jalankan saran sebelum metode dieksekusi, yang sering digunakan untuk verifikasi tanda tangan, otentikasi, dll.
Setelah: Eksekusi setelah metode eksekusi selesai, apakah eksekusi berhasil atau pengecualian dilemparkan.
AfterReturning: Jalankan hanya setelah metode eksekusi berhasil.
Afterthrowing: Jalankan hanya setelah eksekusi metode melempar pengecualian.
Aspek sederhana:
@Aspek @componentpublic kelas befeaspect {@before ("commonjoinpointconfig.servicelayerexecution ()") public void Sebelumnya (joinpoint goinpoint) {System.out.println ("---------------> sebelum aspek"); System.out.println ("----------------> Sebelum Eksekusi" + JoinPoint); }}4. Anotasi khusus
Misalkan kita ingin mengumpulkan waktu eksekusi metode tertentu, cara yang lebih masuk akal adalah menyesuaikan anotasi dan kemudian menambahkan anotasi ini ke metode yang perlu mengumpulkan waktu eksekusi.
Pertama -tama tentukan jejak anotasi:
@Target ({elementType.method, elementType.type}) @retensi (retentionpolicy.runtime) public @interface tracktime {string param () default "";}Kemudian tentukan kelas aspek untuk mengimplementasikan perilaku anotasi:
@Aspek@componentpublic kelas trackTimeAspect {@around ("@annotation (tracktime)") objek publik di sekitar (ProsesingJoINPoint gabungan, tracktime tracktime) melempar Throwable {objek hasil = null; Long StartTime = System.CurrentTimeMillis (); hasil = joinpoint.proed (); long timeTaken = system.currentTimeMillis () - startTime; System.out.println ("--------------> Waktu yang diambil oleh" + joinpoint + "dengan param [" + tracktime.param () + "] adalah" + timeTaken); hasil pengembalian; }}Dengan menggunakan anotasi ini pada suatu metode, Anda dapat mengumpulkan waktu eksekusi metode ini:
@Tracktime (param = "myService") public string runfoo () {System.out.println ("----------------> foo"); mengembalikan "foo";}Perhatikan bahwa anotasi @TrackTime (param = "MyService") dapat dilewati.
Agar anotasi untuk lulus parameter, Anda perlu menentukan parameter string param () default "default" saat mendefinisikan anotasi.
Pada saat yang sama, di kelas aspek, parameter yang sesuai ditambahkan ke metode sekitar. Nama variabel parameter juga diperlukan untuk menjadi tracktime dalam anotasi @Around, tetapi bukan tracktime nama kelas.
@Around ("@annotation (tracktime)") objek publik di sekitar (Prosidingjoinpoint gabungan, tracktime tracktime)5. Ringkasan
Saat menjalankan proyek sampel, konsol menghasilkan berikut:
----------------> Sebelum Aspek
--------------> Sebelum eksekusi eksekusi (String cn.springcamp.springaop.service.myservice.runfoo ())
---------------> foo
---------------> Waktu yang Diambil dengan Eksekusi (String CN.SPRINGCAMP.SPRINGAOP.SERVICE.MYSERVICE.RUNFOO ()) dengan Param [MyService] adalah 8
---------------> Setelah Aspek
--------------> Setelah eksekusi eksekusi (String cn.springcamp.springaop.service.myservice.runfoo ())
---------------> Aspek setelah kembali
----------------> Eksekusi (String cn.springcamp.springaop.service.myservice.runfoo ()) dikembalikan dengan nilai foo
Dapat dilihat bahwa urutan eksekusi dari beberapa aspek sebelumnya setelah sekitar setelah kembali (afterhrowing)
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.