ภาพรวม
โมดูล Spirng-Aop เป็นโมดูลหลักในกรอบสปริง แม้ว่าคอนเทนเนอร์ Spring IOC จะไม่พึ่งพา AOP แต่ AOP ก็ให้บริการโซลูชันที่ทรงพลังและยืดหยุ่นในการใช้งาน IOC
ในกรอบฤดูใบไม้ผลิ AOP ส่วนใหญ่จะใช้สำหรับสองวัตถุประสงค์:
จากมุมมองที่ใช้งานได้ AOP อาจถูกมองว่าเป็นส่วนประกอบของวิธีการเขียนโปรแกรม OOP ซึ่งเป็นวิธีที่แตกต่างกันของรหัสหรือองค์กรระบบ แนวคิดหลักใน OOP คือคลาสและใน AOP เป็นแง่มุม
โมดูล Spirng-Aop เป็นโมดูลหลักในกรอบสปริง แม้ว่าคอนเทนเนอร์ Spring IOC จะไม่พึ่งพา AOP แต่ AOP ก็ให้บริการโซลูชันที่ทรงพลังและยืดหยุ่นในการใช้งาน IOC
ในกรอบฤดูใบไม้ผลิ AOP ส่วนใหญ่จะใช้สำหรับสองวัตถุประสงค์:
Spring AOP ถูกนำไปใช้ใน Java บริสุทธิ์และไม่จำเป็นต้องมีการประมวลผลการรวบรวมพิเศษและไม่จำเป็นต้องมีการควบคุมลำดับชั้นของตัวโหลดคลาสดังนั้นจึงสามารถใช้สำหรับคอนเทนเนอร์ Servlet และเซิร์ฟเวอร์แอปพลิเคชันอื่น ๆ
Spring AOP ปัจจุบันรองรับการสลับหรือการสกัดกั้นระดับเมธอดเท่านั้นและไม่รองรับการสกัดกั้นแอตทริบิวต์ในขณะนี้ หากคุณต้องการสกัดกั้นแอตทริบิวต์คุณสามารถพิจารณาใช้ภาษา AspectJ
สปริง AOP ใช้แตกต่างจากเฟรมเวิร์ก AOP อื่น ๆ ส่วนใหญ่ จุดประสงค์หลักของมันคือไม่ให้การใช้งาน AOP ขนาดใหญ่และครอบคลุม แต่เพื่อรวมการใช้งาน AOP ที่แตกต่างกันและร่วมมือกับ Spring IOC เพื่อช่วยแก้ปัญหาที่พบบ่อย
ควรสังเกตว่ามีคำแนะนำที่ดีบางอย่าง (เช่นโมเดลโดเมน) สปริง AOP มักจะไม่ได้รับการสนับสนุนที่ดีและสถานการณ์นี้ยังคงพิจารณาถึงแง่มุม ถึงกระนั้นในประสบการณ์ทั่วไปกลไกอันทรงพลังของ AOP ก็ยังสามารถแก้ปัญหาได้ในสถานการณ์ส่วนใหญ่
ดังนั้นเราควรดู Spring AOP และ APISICEJ ได้อย่างไรโดยอ้างถึงข้อความต้นฉบับของเอกสารทางการของฤดูใบไม้ผลิ:
ฤดูใบไม้ผลิ AOP จะไม่ดิ้นรนเพื่อแข่งขันกับ APISICJ เพื่อจัดหาโซลูชัน AOP ที่ครอบคลุม เราเชื่อว่าเฟรมเวิร์กที่ใช้พร็อกซีทั้งสองเช่นฤดูใบไม้ผลิ AOP และเฟรมเวิร์กเต็มรูปแบบเช่น AspectJ นั้นมีค่าและพวกเขาจะเสร็จสมบูรณ์มากกว่าในการแข่งขัน ฤดูใบไม้ผลิรวมสปริง AOP และ IOC เข้ากับ APISICJ เพื่อให้การใช้งานทั้งหมดของ AOP สามารถรองรับได้ภายในสถาปัตยกรรมแอปพลิเคชันที่ใช้สปริงที่สอดคล้องกัน การรวมนี้ไม่ส่งผลกระทบต่อ Spring AOP API หรือ AOP Alliance API: Spring AOP ยังคงเข้ากันได้ย้อนหลัง
ในการออกแบบโมดูลสปริงเฟรมเวิร์กทั้งหมดหนึ่งในหลักการหลักที่ยึดติดอยู่เสมอคือไม่รุกราน
ดังนั้นเมื่อใช้ Spring AOP เราจะไม่บังคับให้เราแนะนำคลาสหรืออินเทอร์เฟซที่เฉพาะเจาะจงลงในรหัสธุรกิจซึ่งสามารถรักษารหัสให้สะอาดและ decouple ในระดับสูงสุด อย่างไรก็ตามสปริงยังมีตัวเลือกอื่นหากมีสถานการณ์เฉพาะคุณสามารถแนะนำ Spring AOP ในรหัสของคุณโดยตรง โมดูลเกือบทั้งหมดในกรอบฤดูใบไม้ผลิจะให้ตัวเลือกที่หลากหลายในวิธีที่พวกเขาใช้เพื่อให้ผู้ใช้สามารถเลือกวิธีที่เหมาะสมกว่าสำหรับสถานการณ์ของพวกเขา ใช้ AspectJ หรือ Spring AOP ใช้คำอธิบายประกอบหรือวิธีการกำหนดค่า XML ขึ้นอยู่กับ U.
หลังจากทำความเข้าใจกับความตั้งใจดั้งเดิมและสถานการณ์การใช้งานของฤดูใบไม้ผลิ AOP ลองมาดูหลักการดำเนินการทั่วไป
ปัญหาส่วนใหญ่ในโลกซอฟต์แวร์สามารถแก้ไขได้โดยการเพิ่มเลเยอร์
เลเยอร์ที่กล่าวถึงที่นี่มีความหมายกว้างซึ่งอาจเป็นนามธรรมหรือแคชซึ่งหมายถึงหมวดหมู่ของการแยกและการแยก
ในโลกฤดูใบไม้ผลิการแนะนำของแต่ละโมดูลหรือการรวมเทคโนโลยีของบุคคลที่สามจะให้เลเยอร์ที่เป็นนามธรรมเสมอให้ API แบบครบวงจรแก่ผู้ใช้บล็อกรายละเอียดการใช้งานทั้งหมดและความแตกต่างระหว่างการใช้งานที่แตกต่างกัน ตัวอย่างเช่นโมดูลเช่นสปริงแคช, Spring-JDBC, Spring-JMS และ SPIRNG-Messaging ทั้งหมดให้ชั้นของสิ่งที่เป็นนามธรรม
การใช้งาน Spring AOP เป็นกลไกที่ใช้พร็อกซีซึ่งใช้พร็อกซีไดนามิก JDK โดยค่าเริ่มต้นและยังสามารถใช้ CGLIB พร็อกซีได้ ความแตกต่างระหว่างทั้งสองส่วนใหญ่เป็นความแตกต่างระหว่างวัตถุที่เป็นพร็อกซี่ เมื่อวัตถุเป้าหมายเป็นอินเทอร์เฟซ JDK Dynamic Proxy สามารถทำให้พร็อกซีเสร็จสมบูรณ์ได้ แต่เมื่อวัตถุเป้าหมายไม่ได้ใช้คลาสอินเตอร์เฟส (พยายามที่จะน้อยลงการเขียนโปรแกรมอินเทอร์เฟซที่มุ่งเน้นเป็นนิสัยที่ดี) จำเป็นต้องใช้ CGLIB Proxy เพื่อทำให้พร็อกซีเสร็จสมบูรณ์ แน่นอนคุณยังสามารถบังคับให้อินเทอร์เฟซใช้ CGLIB เป็นพร็อกซี นอกจากนี้เมื่อจำเป็นต้องฉีดหรืออ้างอิงประเภทเฉพาะหากวัตถุที่อ้างอิงเป็นวัตถุพร็อกซีคุณต้องใช้วิธี CGLIB ด้วย
การออกแบบและการใช้งานสามารถแบ่งออกเป็นสองส่วนสำคัญ
การสร้าง AOP
คลาสหลักที่สร้างวัตถุพร็อกซี ProxyFactoryBean GetObject ()
รูปต่อไปนี้คือตรรกะการเลือกว่าจะใช้ JDK หรือ CGLIB เมื่อสร้างพร็อกซี:
หลังจากค้นหาผู้ดำเนินการเฉพาะของเอเจนต์การสร้างการดำเนินการนี้เรียกว่าเมื่อใด ผู้ที่เข้าใจวงจรชีวิตของถั่วฤดูใบไม้ผลิควรรู้ว่าเมื่อมีการสร้างถั่วมีชุดของอินเทอร์เฟซการโทรกลับสำหรับผู้ใช้เพื่อแทรกพฤติกรรมที่กำหนดเองเพื่อมีอิทธิพลต่อลักษณะของถั่ว BeanPostProcessor เป็นหนึ่งในอินเทอร์เฟซ บทความก่อนหน้านี้ได้รับการแนะนำ (อาวุธที่ดีที่สุดในการเล่นกับถั่วฤดูใบไม้ผลิ) Spring AOP ใช้ประโยชน์จากโอกาสนี้ในการแทรกเคล็ดลับในกระบวนการสร้างถั่ว หากการสร้างถั่วเป็นเป้าหมาย AOP ของเราให้สร้างพร็อกซีและในที่สุดก็ส่งคืนวัตถุพร็อกซีไปยัง IOC
Abstractautoproxycreator คลาสนี้เป็นการใช้งานของ beanpostprocessor ที่ใช้ในการสร้างพร็อกซีดูวิธีการโพสต์การประมวลผลของโปรเซสเซอร์นี้และในที่สุดก็ส่งคืนพร็อกซีที่ส่งคืนโดยวิธี createProxy ()
ปรับปรุงการดำเนินการของส่วน AOP
มันสามารถเข้าใจได้ว่าเป็นการเรียกร้องไปยังโซ่ interceptor ทั้งหมดในวัตถุเป้าหมาย
เนื่องจากมีการใช้งานสองอย่างของ Spring AOP, JDK Dynamic Proxy และ CGLIB วิธีการของการดำเนินการ interceptors จึงแตกต่างกัน สำหรับรายละเอียดคุณสามารถอ่านเมธอด jdkdynamicaopproxy revoke ได้
การโทรไปยังวิธีการเป้าหมายในที่สุดขึ้นอยู่กับ retrictiveMethodinVocation
การประมวลผลกระบวนการใน ReflectiveMethodinVocation ใช้วิธีการเรียกซ้ำเพื่อประมวลผลโซ่สกัดกั้น
วิธีการสกัดกั้นของ cglibaopproxy
CGLIBMETHODINVOCATION สืบทอด retheriveMethodinVocation และวิธีกระบวนการ () ด้านบนใช้เพื่อจัดการกับโซ่สกัดกั้น
สองรายละเอียดที่ควรทราบเมื่อใช้ Spring AOP:
1. สปริง AOP ไม่ทำงานเมื่อเรียกวิธีการภายในชั้นเรียน (การปลุกปั่นตนเอง) เนื่องจากการโทรภายในไม่ผ่านวัตถุพร็อกซีและใช้โดยตรง วิธีแก้ปัญหาคือ:
2. เมื่อฉีดถั่วถ้าคุณต้องการฉีดถั่วชนิดเฉพาะแทนอินเทอร์เฟซให้ใช้ cglib
Spring AOP มีฟังก์ชั่นที่ทรงพลังและการออกแบบที่ชาญฉลาด บริบทหลักจะถูกแยกออกที่นี่และรายละเอียดจะไม่ถูกกล่าวถึงทีละคน
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com