คำอธิบายคนธรรมดาสำหรับคนที่ยังใหม่กับแนวคิด AOP นี่ไม่ใช่ข้อมูลที่ครบถ้วนสมบูรณ์ แต่ควรช่วยในการเข้าใจแนวคิด หากคุณคุ้นเคยกับศัพท์แสงพื้นฐานแล้วคุณสามารถหยุดอ่านได้เลย
สมมติว่าคุณมีพนักงานระดับปกติและคุณต้องการทำอะไรบางอย่างทุกครั้งที่มีการเรียกวิธีการเหล่านี้
class Employee{
public String getName(int id){....}
private int getID(String name){...}
}
วิธีการเหล่านี้จะเรียกว่าJoinPoints เราต้องการวิธีในการระบุวิธีการเหล่านี้เพื่อให้เฟรมเวิร์กสามารถค้นหาเมธอดในทุกคลาสวิธีที่โหลดไว้ ดังนั้นเราจะเขียนนิพจน์ทั่วไปเพื่อให้ตรงกับลายเซ็นของวิธีการเหล่านี้ ในขณะที่มีมากขึ้นในการเป็นคุณจะเห็นด้านล่าง แต่อย่างหลวม ๆ นี้แสดงออกปกติเป็นสิ่งที่กำหนดpointcut เช่น
* * mypackage.Employee.get*(*)
First * ใช้สำหรับตัวปรับแต่ง public / private / protected / default วินาที * คือประเภทการส่งคืนของวิธีการ
แต่คุณต้องบอกอีกสองสิ่ง:
- ควรดำเนินการเมื่อใด - เช่นก่อน / หลังการดำเนินการตามวิธีการหรือยกเว้น
- สิ่งที่มันควรจะทำอย่างไรเมื่อมันตรงกับ (อาจจะเพียงแค่พิมพ์ข้อความ)
การรวมกันของสองคนนี้จะเรียกว่าแนะนำ
อย่างที่นึกออกคุณจะต้องเขียนฟังก์ชันเพื่อให้สามารถทำ # 2 ได้ นี่คือลักษณะของข้อมูลพื้นฐาน
หมายเหตุ: เพื่อความชัดเจนให้ใช้คำว่าREGEXแทน* * mypackage.Employee.get*(*)
. ในความเป็นจริงการแสดงออกที่สมบูรณ์จะเข้าสู่นิยาม
@Before("execution(REGEX)")
public void doBeforeLogging() {....} <-- executed before the matching-method is called
@After("execution(REGEX)")
public void doAfterLogging() {....} <-- executed after the matching-method is called
เมื่อคุณเริ่มใช้สิ่งเหล่านี้สักหน่อยคุณอาจต้องระบุคำแนะนำ @ After / @ Before / @ Around มากมาย ซ้ำแสดงออกปกติในที่สุดก็จะจบลงด้วยการทำสิ่งที่ทำให้เกิดความสับสนและยากที่จะรักษา สิ่งที่เราทำเราเพียงแค่ตั้งชื่อให้กับนิพจน์และใช้ในที่อื่น ๆ ในคลาส Aspect
@Pointcut("execution(REGEX)") <-- Note the introduction of Pointcut keyword
public void allGetterLogging(){} <-- This is usually empty
@Before("allGetterLogging")
public void doBeforeLogging() {....}
@After("allGetterLogging")
public void doAfterLogging() {....}
BTW คุณต้องการรวมตรรกะทั้งหมดนี้ไว้ในคลาสที่เรียกว่าAspectและคุณจะเขียนคลาส:
@Aspect
public class MyAwesomeAspect{....}
เพื่อให้สิ่งเหล่านี้ทำงานได้ผลคุณจะต้องบอกให้ Spring แยกวิเคราะห์ชั้นเรียนเพื่ออ่านทำความเข้าใจและดำเนินการกับคำหลัก @ AOP วิธีหนึ่งที่ทำได้คือระบุสิ่งต่อไปนี้ในไฟล์ spring config xml:
<aop:aspectj-autoproxy>