สปริง AOP เป็นหนึ่งในส่วนสำคัญของโครงสร้างสปริง ในขั้นตอนพื้นฐานมากกรอบสปริงจะขึ้นอยู่กับ IoC และ AOP ในเส้นทางที่เป็นทางการของฤดูใบไม้ผลิมีสไลด์ที่มันบอกว่า:
AOP เป็นหนึ่งในส่วนที่สำคัญที่สุดของกรอบ
จุดสำคัญสำหรับการทำความเข้าใจวิธีการทำงานของ AOP ในฤดูใบไม้ผลิคือเมื่อคุณเขียน Aspect with Spring เราได้กำหนดกรอบการทำงานด้วยการสร้าง proxy สำหรับวัตถุของคุณ JDKDynamicProxy
ถ้า bean ของคุณใช้อินเตอร์เฟสหรือผ่าน CGLIB ถ้า bean ของคุณไม่ได้ใช้ อินเตอร์เฟซ. จำไว้ว่าคุณต้องมี cglib 2.2 ใน class-path ของคุณหากคุณใช้ Spring ก่อนเวอร์ชัน 3.2 เริ่มต้นจาก Spring 3.2 มันไร้ประโยชน์เพราะ cglib 2.2 รวมอยู่ในแกน
เฟรมเวิร์กที่การสร้าง bean จะสร้างพร็อกซีที่ล้อมวัตถุของคุณและเพิ่มความรับผิดชอบข้ามความกังวลเช่นความปลอดภัยการจัดการธุรกรรมการบันทึกและอื่น ๆ
การสร้างพร็อกซีในลักษณะนี้จะถูกนำไปใช้เริ่มต้นสำหรับนิพจน์จุดตัดที่ใช้เป็นกรอบในการตัดสินใจว่าถั่วและวิธีการใดที่จะถูกสร้างเป็นพร็อกซี คำแนะนำจะเป็นความรับผิดชอบมากกว่ารหัสของคุณ โปรดจำไว้ว่าในกระบวนการนี้จุดตัดจะบันทึกเฉพาะวิธีสาธารณะที่ไม่ได้รับการประกาศเป็นขั้นสุดท้าย
ขณะนี้ใน Spring AOP การทอผ้าของ Aspects จะดำเนินการโดยคอนเทนเนอร์ที่การเริ่มต้นคอนเทนเนอร์ใน AspectJ คุณต้องดำเนินการนี้ด้วยการรวบรวมโพสต์โค้ดของคุณผ่านการปรับเปลี่ยนแบบ bytecode ด้วยเหตุผลนี้ฉันคิดว่าวิธีการแบบสปริงนั้นง่ายกว่าและจัดการได้ง่ายกว่า AspectJ
ในทางตรงกันข้ามกับ Spring AOP คุณไม่สามารถใช้พลังทั้งหมดของ AOP ได้เนื่องจากการใช้งานจะกระทำผ่านพร็อกซีและไม่ได้ผ่านการแก้ไขโค้ดของคุณ
เช่นเดียวกับใน AspectJ คุณสามารถใช้การทอผ้าแบบโหลดโหลดใน SpringAOP คุณสามารถได้รับประโยชน์จากฟีเจอร์นี้ในฤดูใบไม้ผลิซึ่งมีการใช้งานกับเอเจนต์และการกำหนดค่าพิเศษ@EnabledLoadWeaving
หรือใน XML คุณสามารถใช้พื้นที่ชื่อเป็นตัวอย่าง อย่างไรก็ตามใน Spring AOP คุณไม่สามารถสกัดกั้นทุกกรณี ตัวอย่างเช่นnew
คำสั่งไม่ได้รับการสนับสนุนใน Spring AOP
อย่างไรก็ตามใน Spring AOP คุณจะได้รับประโยชน์จากการใช้ AspectJ ผ่านการใช้aspectof
วิธีการจากโรงงานในการกำหนดค่า spring bean
สำหรับเหตุผลที่ Spring AOP นั้นเป็นพร็อกซีที่สร้างจากคอนเทนเนอร์ดังนั้นคุณสามารถใช้ AOP สำหรับสปริงถั่วเท่านั้น ในขณะที่ใช้ AspectJ คุณสามารถใช้มุมมองในถั่วทั้งหมดของคุณ จุดเปรียบเทียบอีกประการหนึ่งคือการดีบักและความสามารถในการคาดการณ์พฤติกรรมของโค้ด ด้วย spring AOP งานจะถูก preform ทั้งหมดจากคอมไพเลอร์ Java และแง่มุมเป็นวิธีที่ยอดเยี่ยมสำหรับการสร้างพร็อกซีสำหรับ Spring bean ของคุณ ใน AspectJ หากคุณปรับเปลี่ยนรหัสคุณต้องรวบรวมและเข้าใจว่าลักษณะของผ้าทอของคุณเป็นอย่างไร แม้การปิดระบบการทอผ้าในฤดูใบไม้ผลิก็ง่ายขึ้นด้วยสปริงคุณสามารถลบมุมมองออกจากการกำหนดค่ารีสตาร์ทและใช้งานได้ ใน AspectJ คุณจะต้องคอมไพล์โค้ดอีกครั้ง!
ในการทอผ้าแบบโหลดความเร็ว AspectJ นั้นยืดหยุ่นกว่าสปริงเนื่องจากสปริงไม่รองรับตัวเลือกทั้งหมดของ AspectJ แต่ในความคิดของฉันหากคุณต้องการเปลี่ยนกระบวนการสร้างถั่ววิธีที่ดีกว่าคือการจัดการล็อกอินแบบกำหนดเองในโรงงานและไม่ใช่การทอผ้าแบบโหลดโหลดในแง่มุมที่เปลี่ยนพฤติกรรมของผู้ให้บริการใหม่ของคุณ
ฉันหวังว่าภาพมุมกว้างของ AspectJ และ Spring AOP นี้จะช่วยให้คุณเข้าใจถึงความแตกต่างของยาสองชนิด