Kata pengantar
AOP adalah singkatan untuk pemrograman berorientasi aspek. Ini adalah konsep yang berlawanan dengan pemrograman yang berorientasi objek. Dalam pemrograman yang berorientasi pada objek, kita cenderung mengadopsi konsep-konsep seperti enkapsulasi, pewarisan, dan polimorfisme untuk mengimplementasikan setiap fungsi dalam objek. Namun, dalam situasi aktual, kami juga menemukan bahwa ada persyaratan lain bahwa jenis fungsi diperlukan dalam banyak metode dari banyak objek. Misalnya, beberapa metode untuk akses basis data memiliki persyaratan manajemen transaksi, dan banyak metode memerlukan log pencetakan. Dengan cara yang berorientasi objek, fungsi-fungsi yang sama ini harus diimplementasikan di banyak tempat atau dipanggil di banyak tempat. Ini sangat rumit dan terlalu dekat dengan persyaratan bisnis-independen ini. Jadi kemudian, pemrograman berorientasi aspek tampaknya menyelesaikan masalah jenis ini, dan membuat suplemen yang baik untuk pemrograman yang berorientasi objek
konsep
Untuk memahami pemrograman yang berorientasi pada tangen dengan baik, Anda harus terlebih dahulu memahami beberapa konsep AOP. Di Java, AspectJ mengimplementasikan fungsi AOP dengan cara yang relatif lengkap, tetapi juga lebih kompleks untuk digunakan, jadi di sini terutama untuk membahas AOP Spring. Spring AOP mengadopsi prinsip kesederhanaan dan kecukupan untuk mewujudkan fungsi inti AOP. Mari kita bicara tentang konsep spesifik di AOP terlebih dahulu
Implementasi AOP Sprinboot
Kami telah menggunakan beberapa bab untuk menggambarkan penggunaan dasar springboot. Jadi di sini kami menggunakan Springboot dan AOP untuk menggabungkan untuk mengimplementasikan fungsi output semua parameter input antarmuka REST dan logameter logam.
Menerapkan fungsi Layanan REST.
Menurut artikel sebelumnya, pertama -tama kita akan membangun proyek Springboot seperti yang ditunjukkan pada gambar berikut
proyek demo
Konfigurasi Proyek Springboot
Kami mengkonfigurasi proyek springboot sebagai berikut
Server: Port: 3030 Servlet: Context-path: /aop-demospring: jackson: tanggal-format: yyyy-mm-dd hh: mm: SS Serialisasi: indent-output: truelogging: level: com.yanggch: debug
Konfigurasi yang berhubungan dengan Jackson adalah untuk mengeluarkan objek ke dalam string JSON dan memformat output.
Kelas pengontrol yang mengimplementasikan antarmuka istirahat
Di sini kami menerapkan dua antarmuka istirahat. Salah satunya adalah mengembalikan informasi Hello. Salah satunya adalah mengembalikan informasi login berdasarkan input.
Paket com.yanggch.demo.aop.web; impor com.yanggch.demo.aop.domain.loginentity; impor com.yanggch.demo.aop.domain.securityity; impor org.springframework.web.bind.annotation.pathvariable; org.springframework.web.bind.annotation.requestbody; impor org.springframework.web.bind.annotation.requestmapping; impor org.springframework.web.bind.annotation.requestmethod; impor orgconstringframework.wind.bind.notation.requestmethod; impor orgconstringframework.wind.bind. java.util.date;/*** Layanan istirahat terkait keamanan** @Author: Yang Gaochao* @since: 2018-05-27*/ @restcontroller @requestMapping ("/API/V1/Security") Public ClassAPI {@requestmapping (value = "/LOGIN/{{{"/{{@requestmapping {value = "/loin/{{@requestmapping) Login (@RequestBody LoginEntity LoginEntity, @pathvariable long shopId) {SecurityEntity SecurityEntity = new SecurityEntity (); SecurityEntity.SetShopid (ShopID); SecurityEntity.setAccount (loginEntity.getAccount ()); SecurityEntity.setPwd (loginEntity.getPwd ()); SecurityEntity.setLogInime (tanggal baru ()); mengembalikan keamanan; } @RequestMapping (value = "/echo/{name}", method = requestMethod.get) Public String Login (@PathVariable string name) {return "hello," + name; }}Pertama, kami ingin mengeluarkan parameter input dan mengembalikan hasil semua antarmuka REST ke log melalui fungsi AOP.
Menerapkan fungsi AOP web.
Paket com.yanggch.demo.aop.comment; import com.fasterxml.jackson.databind.objectmapper; impor org.aspectj.lang.joinpoint; impor org.aspectj.ang.annotation.aspect; impor org.aspecpe.annotation.before; Impor org.aspectj.annotation.before; Impor org.aspecpoP.Annotation; Before; Impor org.aspectj.anannotation.before; org.aspoPoP.ApPOP.Annotasi; org.slf4j.logger; impor org.slf4j.loggerFactory; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.stereotype.sterponent; impor org.springframework.weB.multipartye. javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletResponse;/*** Log Antarmuka Web** @Author: Yang Gaochao* @since: 2018-05-27*/ @aspek @componentpublic Class Weochaspect: 2018-05 LoggerFactory.getLogger (WebLogaspect.class); Private Final ObjectMapper Mapper; @Autowired public weblogaspect (ObjectMapper mapper) {this.mapper = mapper; } @Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)") public void webLog() { } @Before("webLog()") public void doBefore(JoinPoint joinPoint) { for (Object object : joinPoint.getArgs()) { if ( object instanceof MultipartFile || object instanceof Httpservletrequest ||. } coba {if (log.isdebugeNabled ()) {log.debug (joinpoint.getTarget (). getClass (). getName () + "." + joinpoint.getSignature (). }} catch (Exception e) {e.printstacktrace (); }}} @Afterreturning (returning = "response", pointcut = "weblog ()") public void doafterreturning (respons objek) melempar lempar {if (respons! = Null) {log.debug ("Parameter respons:" + mapper.writevalueasString (respons); }}}Berikut adalah beberapa hal yang harus diperhatikan.
tes
Di latar depan, permintaan dimulai melalui Postman, dan hasil input log latar belakang adalah sebagai berikut
2018-05-27 19: 58: 42.941 DEBUG 86072 --- [NIO-3030-EXEC-4] C.YANGGCH.Demo.Aop.comment.weblogaspect: com.yanggch.demo.aop.web.securityapi.login: permintaan parameter: {{{{{Securityapi.login: Parameter {
"akun": "yANGGCH",
"PWD": "123456"
}
2018-05-27 19: 58: 42.941 DEBUG 86072 --- [NIO-3030-EXEC-4] C.YANGGCH.Demo.Aop.comment.WebLogaspect: com.yanggch.demo.aop.web.securityapi.login: permintaan parameter: 2001
2018-05-27 19: 58: 42.942 DEBUG 86072 --- [NIO-3030-EXEC-4] C.YANGGCH.Demo.Aop.comment.weblogaspect: Parameter Respons: {
"Shopid": 2001,
"akun": "yANGGCH",
"PWD": "123456",
"LogInime": "2018-05-27 11:58:42"
}
2018-05-27 19: 58: 45.796 DEBUG 86072 --- [NIO-3030-EXEC-5] C.YANGGCH.DEMO.AOP.CEB.WEBLOGASEK: COM.YANGGCH.DEMO.AOP.WEB.SECURURYAPI.ECHO: Minta Parameter: "YANGGCH"
2018-05-27 19: 58: 45.796 DEBUG 86072 --- [NIO-3030-EXEC-5] C.YANGGCH.Demo.Aop.comment.weblogaspect: Parameter Respons: "Halo, Yanggch"
Dari sini kita dapat melihat bahwa meskipun kita tidak menulis kode untuk mengeluarkan login log di antarmuka REST, kita dapat secara otomatis menambahkan kode untuk mengeluarkan parameter entri dan mengembalikan parameter ke setiap metode entri istirahat melalui AOP dan menjalankannya dengan benar.
Instruksi lainnya
Jenis nasihat dan bahasa ekspresi AOP untuk Pointcut disebutkan sebelumnya. Untuk referensi spesifik, silakan merujuk mereka sebagai berikut.
Jenis saran
Bahasa ekspresi AOP
1. Pencocokan parameter metode
@args ()
2. Metode Deskripsi Pencocokan
eksekusi (pengubah-pola? Ret-tipe-pola-pola-pola-pola-pola-pola (param-pola) lemparan-pola?)
Di mana pola tipe pengembalian, pola nama, dan pola parameter diperlukan.
. Ret-Type-Pattern: Dapat berupa nama kelas yang mewakili nilai pengembalian, jalur lengkap, dll.
*. Pola nama: Tentukan nama metode, * mewakili semua
.set mewakili semua metode yang dimulai dengan set.
. PARAMETER POLA: Tentukan parameter metode (tipe dinyatakan), (..) mewakili semua parameter, dan () mewakili satu parameter
. (, String) berarti bahwa parameter pertama adalah nilai apa pun dan yang kedua adalah string tipe.
3. pencocokan tipe objek proxy AOP saat ini
4. Pencocokan kelas target
@target()
@di dalam()
5. Metode pencocokan yang ditandai dengan anotasi ini
@anotasi()
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.