1. Apa itu AOP
AOP adalah singkatan dari pemrograman berorientasi aspek, yang berarti pemrograman yang berorientasi pada aspek. AOP sebenarnya merupakan kelanjutan dari model desain GOF.
2. Beberapa istilah tentang musim semi AOP:
A. Aspek: Di Spring AOP, facet dapat diimplementasikan menggunakan kelas umum atau di kelas normal dengan anotasi @Aspect (gaya @AspectJ)
B. Joinpoint: Di Spring AOP, titik koneksi mewakili eksekusi metode.
C. Saran: Tindakan yang dilakukan pada titik bersama tertentu di bagian tersebut. Ada berbagai jenis pemberitahuan, termasuk "sekitar", "sebelum" dan "setelah". Banyak kerangka kerja AOP, termasuk musim semi, menggunakan pencegat sebagai model pemberitahuan dan mempertahankan rantai pencegat yang berpusat pada titik tautan.
D. Pointcut: Tentukan satu atau sekelompok metode, yang dapat menghasilkan pemberitahuan saat menjalankan metode ini. Spring menggunakan sintaks point-cut AspectJ secara default.
3. Jenis pemberitahuan
A. Pra-notifikasi (@Before): Pemberitahuan yang dieksekusi sebelum titik bergabung, tetapi pemberitahuan ini tidak dapat mencegah eksekusi sebelum titik koneksi (kecuali jika melempar pengecualian)
B. Pemberitahuan Setelah Kembali (@AfterReturning): Pemberitahuan yang dieksekusi setelah titik koneksi (titik bergabung) selesai secara normal: misalnya, metode tidak melempar pengecualian dan pengembalian secara normal
C. Pemberitahuan Setelah Pengecualian dilemparkan (@AfterThrowing): Pemberitahuan yang dieksekusi saat metode melempar pengecualian dan keluar
D. Post Notification (@After): Pemberitahuan yang dieksekusi saat titik koneksi keluar (apakah itu pengembalian normal atau keluarnya yang tidak normal)
E. Surround Notification (@Around): Pemberitahuan seputar titik bergabung, seperti panggilan metode. Ini adalah jenis pemberitahuan yang paling kuat, dan pemberitahuan surround dapat menyelesaikan perilaku khusus sebelum dan sesudah panggilan metode. Itu juga memilih apakah akan terus melaksanakan titik koneksi atau langsung mengembalikan nilai pengembalian mereka sendiri atau melemparkan pengecualian untuk mengakhiri eksekusi
4. @Aspectj gaya konfigurasi AOP
Konfigurasi pegas AOP memiliki dua gaya:
A. XML Style = Menerapkan AOP Spring dalam bentuk deklaratif
B. Aspek Gaya = Menerapkan Spring AOP Menggunakan Formulir Anotasi
5. Contoh
Testaspect
paket com.spring.aop; / *** bagian*/ kelas publik testaspect {public void doafter (goinpoint jp) {system.out.println ("Metode akhir log:" + jp.getTarget (). GetName (). GetName () + "." + Jp.getSignature (). GetName ()); } Doaround Objek Publik (ProsidingJoINPoint PJP) melempar Throwable {Long Time = System.CurrentTimeMillis (); Objek retval = pjp.proed (); waktu = system.currentTimeMillis () - waktu; System.out.println ("Waktu proses:" + waktu + "ms"); retval retval; } public void dobefore (joinpoint jp) {System.out.println ("Metode mulai log:" + jp.getTarget (). getClass (). getName () + "." + jp.getSignature (). getName ()); } public void dothrowing (joinpoint jp, throwable ex) {System.out.println ("Metode" + jp.getTarget (). getClass (). getName () + "." + jp.getSignature (). getName () + "pengecualian"); "); System.out.println (ex.getMessage ()); } private void sendEx (String ex) {// TODO Kirim SMS atau pengingat email}} paket com.spring.service; / ** * Antarmuka A */ Antarmuka Publik Aservice {public void fooa (string _msg); public void bara (); } paket com.spring.service; / ***Kelas Implementasi Antarmuka A*/ Public Class AserviceImpl mengimplementasikan aservice {public void bara () {System.out.println ("aserviceImpl.bara ()"); } public void fooa (string _msg) {System.out.println ("aserviceImpl.fooa (msg:"+_ msg+")"); }} paket com.spring.service; / ** * Kelas Layanan B */ kelas publik BServiceImpl {public void barb (String _msg, int _type) {System.out.println ("BServiceImpl.barb (msg:"+_ msg+"Tipe:"+_ type+")"); if (_type == 1) melempar IllegalArgumentException baru ("Test Exception"); } public void foob () {System.out.println ("bServiceImpl.foob ()"); }}ApplicationContext
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls XMLNS: AOP = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http://wwww.springframework http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd" default-autowire="autodetect"> <aop:config> <aop:aspect id="TestAspect" ref="aspectBean"> <!--Configure all methods of all classes or Antarmuka di bawah paket layanan com.spring. pointcut-ref = "BusinessService" Method = "doaround"/> <aop: after-throwing pointcut-ref = "BusinessService" method = "dothrowing"/> </aop: aspek> </aop: config> <bean id = "aspekbean"/> <bean id = "aservice"> </bean> </bean> </bean>
Kelas Uji AOPTEST
kelas publik aoptest memperluas abstrakDependencyInjectionPringContextTests {private aservice aservice; Private BServiceImpl BService; string protected [] getConfigLocations () {string [] configs = new string [] {"/AppLicationContext.xml"}; return config; } / *** Uji panggilan normal* / public void testCall () {System.out.println ("SpringTest Junit Test"); aservice.fooa ("test junit fooa"); aservice.bara (); bservice.foob (); bservice.barb ("junit test barb", 0); } / ** * Uji setelah lemparan * / public void testthrow () {coba {bservice.barb ("junit call barb", 1); } catch (IllegalArgumentException e) {}} public void setAservice (aservice service) {aservice = service; } public void setBservice (layanan BServiceImpl) {bService = service; }}
Hasil operasi adalah sebagai berikut:
Metode Awal Log: com.spring.service.aserviceImpl.fooa aserviceImpl.fooa (msg: test junit fooa) Metode akhir log: com.spring.service.aserviceImpl.fooa Metoden: 0 Metode Log: Com.spring.service.AserviceImpl. com.spring.service.aserviceImpl.bara Waktu Proses: 0 MS Log Metode Awal: com.spring.service.bserviceImpl.foob bserviceImpl.foob () Log Metode Ending: Com.Spring.Service.BServiceImpl.foob Time: 0 ms Metode Awal: COM.SERVICE.BSERVICEIMPL.FOOB Waktu: 0 MS MST MUTG.SPRING.SERVICE. BServiceImpl.barb (msg: tes junit tipe barb: 0) Metode akhir log: com.spring.service.bserviceImpl.barb Waktu Proses: 0 MS LOG Awal Metode: com.spring.service.bserviceImpl.barb BServiceImpl. com.spring.service.bserviceImpl.barb Metode com.spring.service.bserviceImpl.barb Lempar Pengecualian Pengecualian Pengecualian