คำนำ
AOP เป็นตัวย่อสำหรับการเขียนโปรแกรมที่มุ่งเน้นด้าน มันเป็นแนวคิดที่ตรงข้ามกับการเขียนโปรแกรมเชิงวัตถุ ในการเขียนโปรแกรมเชิงวัตถุเรามักจะใช้แนวคิดเช่นการห่อหุ้มการถ่ายทอดและ polymorphism เพื่อใช้งานแต่ละฟังก์ชั่นในวัตถุ อย่างไรก็ตามในสถานการณ์จริงเรายังพบว่ามีข้อกำหนดอื่นที่จำเป็นต้องใช้ฟังก์ชันประเภทหนึ่งในหลายวิธีของวัตถุหลายอย่าง ตัวอย่างเช่นวิธีการบางอย่างสำหรับการเข้าถึงฐานข้อมูลมีข้อกำหนดการจัดการธุรกรรมและวิธีการหลายวิธีต้องมีบันทึกการพิมพ์ ในวิธีที่มุ่งเน้นวัตถุฟังก์ชั่นเดียวกันเหล่านี้จะต้องดำเนินการในหลาย ๆ ที่หรือเรียกในหลาย ๆ ที่ นี่เป็นเรื่องยุ่งยากมากและใกล้ชิดกับข้อกำหนดที่ไม่ขึ้นกับธุรกิจเหล่านี้มากเกินไป ดังนั้นในภายหลังการเขียนโปรแกรมที่มุ่งเน้นด้านต่าง ๆ ดูเหมือนจะแก้ปัญหาประเภทนี้และทำอาหารเสริมที่ดีในการเขียนโปรแกรมเชิงวัตถุ
แนวคิด
เพื่อให้เข้าใจการเขียนโปรแกรมแบบแทนเจนต์เป็นอย่างดีคุณต้องเข้าใจแนวคิดบางอย่างของ AOP ก่อน ใน Java, AspectJ ใช้ฟังก์ชั่นของ AOP ในวิธีที่ค่อนข้างสมบูรณ์ แต่ก็มีความซับซ้อนมากขึ้นในการใช้ดังนั้นที่นี่เป็นหลักเพื่อหารือเกี่ยวกับ AOP ของฤดูใบไม้ผลิ ฤดูใบไม้ผลิ AOP ใช้หลักการของความเรียบง่ายและความเพียงพอที่จะตระหนักถึงฟังก์ชั่นหลักของ AOP มาพูดคุยเกี่ยวกับแนวคิดเฉพาะใน AOP ก่อน
การใช้งาน Sprinboot AOP
เราได้ใช้หลายบทเพื่ออธิบายการใช้งานขั้นพื้นฐานของ Springboot ดังนั้นที่นี่เราใช้ Springboot และ AOP เพื่อรวมเข้าด้วยกันเพื่อใช้ฟังก์ชันของการส่งออกพารามิเตอร์อินพุตส่วนต่อประสานทั้งหมดและบันทึกพารามิเตอร์การส่งคืน
ใช้ฟังก์ชั่นบริการ REST
ตามบทความก่อนหน้านี้เราจะสร้างโครงการ Springboot ก่อนที่แสดงในรูปต่อไปนี้
โครงการสาธิต
การกำหนดค่าโครงการ Springboot
เรากำหนดค่าโครงการ Springboot ดังนี้
เซิร์ฟเวอร์: พอร์ต: 3030 servlet: บริบท-ธ : /aop-demospring: แจ็คสัน: วันที่-รูปแบบ: yyyy-mm-dd hh: mm: ss serialization: intent-output: truelogging: ระดับ: com.yanggch: debug: debug
การกำหนดค่าที่เกี่ยวข้องกับแจ็คสันคือการส่งออกวัตถุไปยังสตริง JSON และจัดรูปแบบเอาต์พุต
คลาสคอนโทรลเลอร์ที่ใช้ส่วนต่อประสาน REST
ที่นี่เราใช้อินเทอร์เฟซพักสองส่วน หนึ่งคือการส่งคืนข้อมูลสวัสดี หนึ่งคือการส่งคืนข้อมูลการเข้าสู่ระบบตามอินพุต
แพ็คเกจ com.yanggch.demo.aop.web; นำเข้า com.yanggch.demo.aop.domain.logenentity; นำเข้า com.yanggch.demo.aop.domain.securityentity; นำเข้า org.springframework.web.bind.annotation. org.springframework.web.bind.annotation.requestbody; นำเข้า org.springframework.web.bind.annotation.Requestmapping; นำเข้า org.springframework.web.bind.annotation.RequestMethod; java.util.date;/*** บริการพักผ่อนที่เกี่ยวข้องกับความปลอดภัย** @author: Yang Gaochao* @since: 2018-05-27*/ @restcontroller @requestmapping ("/api/v1/ความปลอดภัย" เข้าสู่ระบบ (@requestbody loginentity loginentity, @PathVariable Long ShopId) {SecurityEntity SecurityEntity = New SecurityEntity (); SecurityEntity.setShopid (ShopId); SecurityEntity.setAccount (loginentity.getAccount ()); SecurityEntity.setpwd (loginentity.getpwd ()); SecurityEntity.setLogintime (วันที่ใหม่ ()); คืนความปลอดภัย } @RequestMapping (value = "/echo/{name}", method = requestMethod.get) การเข้าสู่ระบบสตริงสาธารณะ (@PathVariable ชื่อสตริง) {return "hello," + name; -ก่อนอื่นเราต้องการส่งพารามิเตอร์อินพุตและส่งคืนผลลัพธ์ของส่วนต่อประสานทั้งหมดไปยังบันทึกผ่านฟังก์ชั่น AOP
ใช้ฟังก์ชั่นเว็บ AOP
แพ็คเกจ com.yanggch.demo.aop.comment; นำเข้า com.fasterxml.jackson.databind.objectmapper; นำเข้า org.aspectj.lang.joinpoint; นำเข้า org.aspectj.lang.annotation.aspect; org.slf4j.logger; นำเข้า org.slf4j.loggerfactory; นำเข้า org.springframework.beans.factory.annotation.autoWired; นำเข้า org.springframework.stereotype.Component; นำเข้า org.springframework. javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse;/*** เว็บอินเตอร์เฟสบันทึก** @author: Yang Gaochao* @Since: 2018-05-27*/ @ LoggerFactory.getLogger (WebLogaspect.class); Mapper ObjectMapper สุดท้ายส่วนตัว; @autowired สาธารณะ weblogaspect (ObjectMapper Mapper) {this.mapper = mapper; } @PointCut (" @Annotation (org.springframework.web.bind.annotation.requestmapping)") โมฆะสาธารณะเว็บล็อก () {} @before ("weblog ()") โมฆะสาธารณะ httpservletrequest || อินสแตนซ์วัตถุของ httpservletResponse) {ดำเนินการต่อ; } ลอง {if (log.isdebugenabled ()) {log.debug (joinpoint.getTarget (). getClass (). getName () + "." + joinpoint.getSignature (). getName () + ":" }} catch (exception e) {e.printstacktrace (); }}} @afterreturning (returning = "การตอบสนอง", pointcut = "weblog ()") โมฆะสาธารณะ doafterreturning (การตอบสนองของวัตถุ) โยนได้ที่ throwable {ถ้า (ตอบกลับ! = null) {log.debug ("พารามิเตอร์การตอบสนอง:" -นี่คือบางสิ่งที่ให้ความสนใจ
ทดสอบ
ในเบื้องหน้าคำขอจะเริ่มต้นผ่านบุรุษไปรษณีย์และผลการป้อนข้อมูลพื้นหลังเป็นดังนี้
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
"บัญชี": "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: ขอพารามิเตอร์: 2001
2018-05-27 19: 58: 42.942 DEBUG 86072 --- [NIO-3030-EXEC-4] C.Yanggch.demo.aop.comment.weblogaspect: พารามิเตอร์การตอบสนอง: {
"ShopId": 2001,
"บัญชี": "Yanggch",
"PWD": "123456"
"Logintime": "2018-05-27 11:58:42"
-
2018-05-27 19: 58: 45.796 DEBUG 86072 --- [NIO-3030-Exec-5] C.Yanggch.demo.aop.comment.weblogaspect: com.yanggch.demo.aop.web.securityapi.echo: ขอพารามิเตอร์:
2018-05-27 19: 58: 45.796 DEBUG 86072 --- [NIO-3030-EXEC-5] C.Yanggch.demo.aop.comment.weblogaspect: พารามิเตอร์การตอบสนอง: "Hello, Yanggch"
จากนี้เราจะเห็นได้ว่าแม้ว่าเราจะไม่เขียนโค้ดสำหรับการส่งออกบันทึกในวิธีการ REST อินเตอร์เฟส แต่เราสามารถเพิ่มรหัสโดยอัตโนมัติสำหรับการส่งพารามิเตอร์รายการและส่งคืนพารามิเตอร์ไปยังแต่ละวิธีการเข้าพักผ่าน AOP และดำเนินการอย่างถูกต้อง
คำแนะนำอื่น ๆ
ประเภทของคำแนะนำและภาษานิพจน์ AOP สำหรับ pointcut ถูกกล่าวถึงก่อนหน้านี้ สำหรับการอ้างอิงเฉพาะโปรดดูพวกเขาดังนี้
ประเภทคำแนะนำ
ภาษานิพจน์ AOP
1. การจับคู่พารามิเตอร์วิธี
@Args ()
2. วิธีการคำอธิบายการจับคู่
การดำเนินการ (ตัวดัดแปลงรูปแบบ?
ในกรณีที่รูปแบบประเภทรูปแบบชื่อและรูปแบบพารามิเตอร์เป็นสิ่งจำเป็น
- ret-type-pattern: สามารถเป็นชื่อคลาสที่แสดงถึงค่าส่งคืนใด ๆ เส้นทางเต็มรูปแบบ ฯลฯ
- ชื่อรูปแบบ: ระบุชื่อเมธอด * แทนทั้งหมด
.set แสดงถึงวิธีการทั้งหมดที่เริ่มต้นด้วยชุด
- รูปแบบพารามิเตอร์: ระบุพารามิเตอร์เมธอด (ประเภทที่ประกาศ), (.. ) แสดงถึงพารามิเตอร์ทั้งหมดและ () หมายถึงพารามิเตอร์หนึ่งพารามิเตอร์
- (, สตริง) หมายความว่าพารามิเตอร์แรกคือค่าใด ๆ และที่สองเป็นประเภทสตริง
3. การจับคู่ประเภทวัตถุพร็อกซี AOP ปัจจุบัน
4. การจับคู่คลาสเป้าหมาย
@เป้า()
@ภายใน()
5. วิธีการจับคู่ที่ทำเครื่องหมายด้วยคำอธิบายประกอบนี้
@Annotation ()
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น