1. AOP คืออะไร
AOP เป็นตัวย่อของการเขียนโปรแกรมที่มุ่งเน้นด้านซึ่งหมายถึงการเขียนโปรแกรมเชิงภาพ AOP เป็นความต่อเนื่องของรูปแบบการออกแบบ GOF
2. คำบางคำเกี่ยวกับฤดูใบไม้ผลิ AOP:
A. แง่มุม: ในฤดูใบไม้ผลิ AOP สามารถนำไปใช้ได้โดยใช้คลาสทั่วไปหรือในชั้นเรียนปกติที่มี @Aspect Annotation (@aspectj Style)
B. การเข้าร่วม: ในฤดูใบไม้ผลิ AOP จุดเชื่อมต่อแสดงถึงการดำเนินการของวิธีการ
C. คำแนะนำ: การกระทำที่ดำเนินการในจุดร่วมเฉพาะในส่วน มีการแจ้งเตือนหลายประเภทรวมถึง "รอบ", "ก่อน" และ "หลังจาก" เฟรมเวิร์ก AOP จำนวนมากรวมถึงฤดูใบไม้ผลิใช้ตัวดักจับเป็นแบบจำลองการแจ้งเตือนและรักษาห่วงโซ่สกัดกั้นจุดเชื่อมโยงจุดเป็นศูนย์กลาง
D. PointCut: กำหนดหนึ่งหรือกลุ่มของวิธีการซึ่งสามารถสร้างการแจ้งเตือนเมื่อดำเนินการวิธีการเหล่านี้ สปริงใช้ไวยากรณ์จุดตัดโดยค่าเริ่มต้น
3. ประเภทการแจ้งเตือน
A. การแจ้งเตือนล่วงหน้า (@Before): การแจ้งเตือนดำเนินการก่อนจุดเข้าร่วม แต่การแจ้งเตือนนี้ไม่สามารถป้องกันการดำเนินการก่อนจุดเชื่อมต่อ (เว้นแต่จะมีข้อยกเว้น)
B. การแจ้งเตือนหลังผลตอบแทน (@AfterReturning): การแจ้งเตือนดำเนินการหลังจากจุดเชื่อมต่อ (จุดรวม) เสร็จสมบูรณ์ตามปกติ: ตัวอย่างเช่นวิธีการไม่ได้ส่งข้อยกเว้นใด ๆ และส่งคืนตามปกติ
C. การแจ้งเตือนหลังจากข้อยกเว้นถูกโยนลงไป (@afterthrowing): การแจ้งเตือนดำเนินการเมื่อวิธีการส่งข้อยกเว้นและออก
D. โพสต์การแจ้งเตือน (@After): การแจ้งเตือนดำเนินการเมื่อจุดเชื่อมต่อออก (ไม่ว่าจะเป็นผลตอบแทนปกติหรือทางออกที่ผิดปกติ)
E. การแจ้งเตือนรอบตัว (@Around): การแจ้งเตือนโดยรอบจุดเข้าร่วมเช่นการโทรวิธี นี่คือประเภทการแจ้งเตือนที่ทรงพลังที่สุดและการแจ้งเตือนรอบ ๆ สามารถทำพฤติกรรมที่กำหนดเองได้ก่อนและหลังการเรียกวิธีการ นอกจากนี้ยังเลือกว่าจะดำเนินการต่อจุดเชื่อมต่อต่อไปหรือส่งคืนค่าผลตอบแทนของตัวเองโดยตรงหรือโยนข้อยกเว้นเพื่อสิ้นสุดการดำเนินการ
4. @aspectj สไตล์การกำหนดค่า AOP
การกำหนดค่า Spring AOP มีสองรูปแบบ:
A. สไตล์ XML = ใช้สปริง AOP ในรูปแบบประกาศ
B. ectionj style = ใช้สปริง AOP โดยใช้แบบฟอร์มคำอธิบายประกอบ
5. ตัวอย่าง
testaspect
แพ็คเกจ com.spring.aop; / *** Section*/ Public Class TestAspect {โมฆะสาธารณะ doafter (JoinPoint jp) {system.out.println ("วิธีการสิ้นสุดบันทึก:" + jp.getTarget (). getClass (). getName () + " + jp.getSignature () } วัตถุสาธารณะ doaround (ดำเนินการ joinpoint pjp) พ่นที่ throwable {long time = system.currenttimeMillis (); วัตถุ retval = pjp.proceed (); time = system.currentTimeMillis () - เวลา; System.out.println ("เวลากระบวนการ:" + เวลา + "MS"); return retval; } โมฆะสาธารณะ Dobefore (JoinPoint jp) {system.out.println ("วิธีการเริ่มต้นบันทึก:" + jp.getTarget (). getClass (). getName () + "." + jp.getSignature () getName ()); } โมฆะสาธารณะ dothrowing (joinpoint jp, throwable ex) {system.out.println ("วิธี" + jp.getTarget (). getClass (). getName () + "." + jp.getSignature () getName () + "การโยนข้อยกเว้น"); System.out.println (ex.getMessage ()); } โมฆะส่วนตัว sendex (String ex) {// todo ส่ง SMS หรือการแจ้งเตือนอีเมล}} แพ็คเกจ com.spring.service; / ** * อินเทอร์เฟซ A */ ส่วนต่อประสานสาธารณะ aservice {โมฆะสาธารณะ fOOA (สตริง _MSG); โมฆะสาธารณะ Bara (); - แพ็คเกจ com.spring.service; / ***คลาสการใช้งานของอินเทอร์เฟซ A*/ คลาสสาธารณะ aserviceimpl ใช้ aservice {โมฆะสาธารณะ bara () {system.out.println ("aserviceimpl.bara ()"); } โมฆะสาธารณะ fooa (สตริง _msg) {system.out.println ("aserviceimpl.fooa (msg:"+_ msg+")"); - แพ็คเกจ com.spring.service; / ** * คลาสบริการ b */ คลาสสาธารณะ bserviceimpl {โมฆะสาธารณะ Barb (สตริง _msg, int _type) {system.out.println ("bserviceimpl.barb (msg:"+_ msg+"พิมพ์:"+_ type+")"); ถ้า (_Type == 1) โยน unlegalargumentException ใหม่ ("ข้อยกเว้นทดสอบ"); } โมฆะสาธารณะ foob () {system.out.println ("bserviceimpl.foob ()"); -ApplicationContext
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd "default-autowire =" Autodetect "> ของคลาสหรืออินเทอร์เฟซทั้งหมดภายใต้ com.spring.service แพ็คเกจ-> <aop: pointcut id = "BusinessService" expression = "การดำเนินการ (*com.spring.service.*.*(.. ))"/> <aop: ก่อน pointcut-ref = "businessservice <AOP: รอบ ๆ pointcut-ref = "BusinessService" method = "doaround"/> <aop: pointcut-ref = "BusinessService" method = "dothrowing"/> </aop: แง่มุม> </aop: config>
ทดสอบคลาส aoptest
Public Class AOPTest ขยาย AbstractDependencyInjectionsPringContextTests {ส่วนตัว aservice aservice; BSERVICIEMPL BSERVICE ส่วนตัว; สตริงที่ได้รับการป้องกัน [] getConfigLocations () {string [] configs = สตริงใหม่ [] {"/ApplicationContext.xml"}; ส่งคืนการกำหนดค่า; } / *** ทดสอบการโทรปกติ* / Public Void TestCall () {System.out.println ("Springtest Junit Test"); aservice.fooa ("junit test fooa"); aservice.bara (); bservice.foob (); bservice.barb ("Junit Test Barb", 0); } / ** * ทดสอบการขว้างปา * / โมฆะสาธารณะ testthrow () {ลอง {bservice.barb ("Junit Call Barb", 1); } catch (unledalargumentException e) {}} โมฆะสาธารณะ setAservice (บริการ aservice) {aservice = บริการ; } โมฆะสาธารณะ setBservice (บริการ bServiceImpl) {bService = บริการ; -
ผลการดำเนินการมีดังนี้:
วิธีการเริ่มต้นบันทึก: com.spring.service.aserviceimpl.fooa aserviceimpl.fooa (msg: junit test fooa) บันทึกการสิ้นสุดวิธีการ: com.spring.service.aserviceimpl.fooa กระบวนการ: 0 MS วิธีการเริ่มต้น: com.spring.service.service.bara com.spring.service.aserviceimpl.bara เวลากระบวนการ: 0 ms บันทึกการเริ่มต้นวิธี: com.spring.service.bserviceimpl.foob bserviceimpl.foob () วิธีการลงบันทึก: com.spring.service.bserviceimpl.foob process: 0 MS bserviceimpl.barb (msg: junit test barb ประเภท: 0) วิธีการลงบันทึกวิธีการสิ้นสุด: com.spring.service.bserviceimpl.barb เวลากระบวนการ: 0 ms บันทึกการเริ่มต้นวิธี: com.spring.service.bserviceimpl.barb bserviceimpl.barb (msg: junit barb com.spring.service.bserviceimpl.barb เมธอด com.spring.service.bserviceimpl.barb ข้อยกเว้นการทดสอบ