การแนะนำ
การเขียนโปรแกรมเชิงมุ่งเน้น (AOP) ให้มุมมองอื่นในการคิดเกี่ยวกับโครงสร้างโปรแกรมซึ่งประกอบไปด้วยข้อบกพร่องของการเขียนโปรแกรมเชิงวัตถุ (OOP) นอกเหนือจากชั้นเรียนแล้ว AOP ยังให้แง่มุม ทำให้โฟกัสเป็นโมดูลเช่นการจัดการธุรกรรมข้ามการตัดของหลายประเภทและวัตถุ (ข้อกำหนดข้อกังวลเหล่านี้มักจะเรียกว่าข้อกังวลเกี่ยวกับการตัดขวาง)
องค์ประกอบสำคัญของสปริงคือเฟรมเวิร์ก AOP อย่างไรก็ตามสิ่งนี้ภาชนะ IOC ในฤดูใบไม้ผลิไม่ได้พึ่งพา AOP ซึ่งหมายความว่าคุณมีอิสระที่จะเลือกว่าจะใช้ AOP หรือไม่ AOP จัดหาโซลูชันมิดเดิลแวร์ที่ทรงพลังซึ่งทำให้ภาชนะ IOC ของสปริงสมบูรณ์ยิ่งขึ้น
ฤดูใบไม้ผลิ 2.0 AOP:
Spring 2.0 แนะนำวิธีที่ง่ายและมีประสิทธิภาพมากขึ้นในการปรับแต่งส่วนและผู้ใช้สามารถเลือกใช้วิธีการที่ใช้สคีมาหรือใช้คำอธิบายประกอบ @aspectJ สำหรับแอปพลิเคชันใหม่หากผู้ใช้กำลังพัฒนาใน Java 5 เราขอแนะนำให้ผู้ใช้ใช้สไตล์ @aspectj มิฉะนั้นรูปแบบตามรูปแบบสามารถใช้งานได้ ทั้งสองรูปแบบสนับสนุนประเภทคำแนะนำอย่างเต็มที่และภาษาจุดในการตัดของ APISICEJ แม้ว่ามันจะยังคงทอผ้าโดยใช้ Spring AOP
บทนี้ส่วนใหญ่กล่าวถึงการสนับสนุนของ Spring 2.0 สำหรับ AOP ที่ใช้รูปแบบและ @AspectJ ฤดูใบไม้ผลิ 2.0 ยังคงความเข้ากันได้ย้อนหลังของฤดูใบไม้ผลิ 1.2 บทต่อไปจะหารือเกี่ยวกับการสนับสนุน AOP พื้นฐานที่จัดทำโดย Spring 1.2 API
AOP ใช้ในฤดูใบไม้ผลิ:
บริการขององค์กรที่ประกาศมีให้โดยเฉพาะอย่างยิ่งในสถานที่ของ EJB Declarative Services บริการที่สำคัญที่สุดคือการจัดการธุรกรรมที่ประกาศซึ่งสร้างขึ้นในการทำธุรกรรมที่เป็นนามธรรมของฤดูใบไม้ผลิ
อนุญาตให้ผู้ใช้ใช้ส่วนที่กำหนดเองและใช้ AOP เพื่อปรับปรุงการใช้ OOP
ตัวอย่าง
เรามักจะใช้ประเภทต่อไปนี้
1. AOP ขึ้นอยู่กับตัวแทน
2. วัตถุจาวาบริสุทธิ์และเรียบง่าย
3. @Aspect คำอธิบายประกอบ
4. มาใช้ส่วน ASPCET ในแบบฟอร์มการฉีดทีละตัว
มาเขียนคลาสพื้นฐานสองสามครั้งก่อน
คลาสอินเตอร์เฟส:
/ *** กำหนดอินเทอร์เฟซ*/ อินเตอร์เฟสสาธารณะที่นอนหลับได้ {/ *** วิธีการนอนหลับ*/ void sleep (); - คลาสการใช้งาน:
/ *** ฉันใช้อินเทอร์เฟซนอนหลับ*/ คลาสสาธารณะ Chenllina ใช้วิธีการนอนหลับ {@Override public void sleep () {// todo วิธีการที่สร้างขึ้นอัตโนมัติระบบ Stub System.out.println ("ดีถึงเวลาเข้านอน!"); - ระดับการปรับปรุง:
/ *** กำหนดการเพิ่มประสิทธิภาพการนอนหลับเพื่อให้ได้ทั้ง pre- และ post-set*/ คลาสสาธารณะ sleephelper ใช้ methodbeforeadvice, afterreturningadvice {@override โมฆะสาธารณะ public ackreturning (returnvalue วัตถุวิธีการ, วัตถุ [] args, วัตถุวัตถุ) } @Override โมฆะสาธารณะก่อน (วิธีการ, วัตถุ [] args, เป้าหมายวัตถุ) พ่น {system.out.println ("ความฝันหลังจากนอนหลับ"); -1. AOP ที่ใช้ตัวแทน
<!-สร้างคำแนะนำที่ได้รับการปรับปรุง-> <bean id = "sleephelper"/> <bean id = "lina"/> <!-กำหนดจุดตัดตรงวิธีการนอนหลับทั้งหมด-> <bean id = "sleeppointcut"> <property name = "pattern" id = "sleephelperadvisor"> <property name = "คำแนะนำ" ref = "sleephelper"/> <property name = "pointcut" ref = "sleeppointcut"/> </ebean> <! <!-<property name = "proxyInterfaces" value = "com.tgb.springaop.service.sleepable"/>-> </ebean>
เช่นเดียวกับในไฟล์กำหนดค่า:
แอตทริบิวต์รูปแบบระบุนิพจน์ทั่วไป มันตรงกับวิธีการนอนหลับทั้งหมด ใช้ org.springframework.aop.support.defaultpointcutvisor เพื่อรวมจุดแทนเจนต์และการปรับปรุงเพื่อสร้างแทนเจนต์ที่สมบูรณ์ หลังจากการกำหนดค่าขั้นสุดท้ายเสร็จสิ้นวัตถุพร็อกซีสุดท้ายจะถูกสร้างขึ้นผ่าน org.springframework.aop.framework.proxyfactorybean
2. วัตถุจาวาบริสุทธิ์และเรียบง่าย
วิธีการพูดว่าวัตถุ Java ง่าย ๆ อย่างหมดจด? ในความคิดของฉันมันสัมพันธ์กับการกำหนดค่าแรกซึ่งไม่จำเป็นต้องใช้พร็อกซี แต่จะสแกนผ่านกลไกภายในของฤดูใบไม้ผลิโดยอัตโนมัติ ในเวลานี้ไฟล์การกำหนดค่าของเราควรได้รับการแก้ไขดังนี้:
<!-สร้างคำแนะนำขั้นสูง-> <bean id = "sleephelper"/> <!-คลาสเป้าหมาย-> <bean id = "lina"/> <!-กำหนดค่าจุดตัดและการแจ้งเตือน-> <bean id = "sleepadvisor"> <property name = "คำแนะนำ" ref = "sleephelper"> </ -> <ถั่ว/>
มันง่ายกว่าคนแรกมากหรือไม่? ไม่จำเป็นต้องกำหนดค่าพร็อกซีอีกต่อไป?
3. @Aspect คำอธิบายประกอบ
จากประสบการณ์ของเราเราก็รู้ว่ารูปแบบของคำอธิบายประกอบนั้นง่ายกว่าไฟล์การกำหนดค่า ในเวลานี้คุณต้องแสดงความคิดเห็นเกี่ยวกับวิธีการหรือคลาสที่มีอยู่:
/ ***เพิ่มการเพิ่มประสิทธิภาพผ่านคำอธิบายประกอบ*/ @aspect @component คลาสสาธารณะ sleephelper03 {/* @pointcut ("การดำเนินการ (*com.tgb.springaop.service.impl ..*(.. ))")*/ @pointcut ("Execution (*.sleep (.. ) โมฆะสาธารณะ beforesleep () {system.out.println ("ใช้หน้ากากใบหน้าก่อนนอน"); } @afterReturning ("Sleeppoint ()") โมฆะสาธารณะ aftersleep () {System.out.println ("Dream After Sleeping"); -
เพียงเขียนในไฟล์กำหนดค่า:
<!-แพ็คเกจสแกน-> <บริบท: Component-Scan base-package = "com.tgb" Annotation-config = "true"/> <!-Aspectj Annotation-> <aop: Aspectj-autoproxy proxy-target-class = "true"/> <!
4. พื้นผิวที่ตัด ASPCET ในรูปแบบการฉีด
โดยส่วนตัวแล้วฉันรู้สึกว่านี่เป็นสิ่งที่ง่ายที่สุดใช้กันมากที่สุดและยืดหยุ่นที่สุด ไฟล์กำหนดค่ามีดังนี้:
<!-คลาสเป้าหมาย-> <bean id = "lina"/> <bean id = "sleephelper"/> <aop: config> <aop: ref = "sleephelper"> <aop: ก่อนวิธี = "beforesleep" pointcut = "การดำเนินการ (** *.sleep (.. )) "/> </aop: แง่มุม> </aop: config>
คลาส sleephelper02 ที่กล่าวถึงในไฟล์กำหนดค่ามีดังนี้:
/ *** เพิ่มการเพิ่มประสิทธิภาพผ่านคำอธิบายประกอบ*/ ระดับสาธารณะ sleephelper02 {โมฆะสาธารณะ beforesleep () {system.out.println ("ใช้หน้ากากใบหน้าก่อนนอน"); } โมฆะสาธารณะ Aftersleep () {System.out.println ("Dream After Sleeping"); -
มันดูง่ายมากหรือไม่? คุณทั้งหมดใช้ Spring AOP หรือไม่? -
เกี่ยวกับวิธีการโทรฉันเขียนชั้นเรียนทดสอบหลายครั้งที่นี่ คุณสามารถดูได้ พวกเขาเหมือนกัน:
/ *** การกำหนดค่าไฟล์ Spring_aop.xml ผ่าน Proxy*/ @Test Public Public Void Test () {ApplicationContext CT = ใหม่ classPathxMlApplicationContext ("Spring_aop.xml"); Sleepable Sleeper = (นอนหลับได้) ct.getBean ("linaproxy"); sleeper.sleep (); } / *** ไฟล์การกำหนดค่า FILE SPRING_AOP_01.XML คำตอบสั้น ๆ JAVA OBJECT* / @Test โมฆะสาธารณะ test01 () {ApplicationContext CT = ใหม่ classPathxMlApplicationContext ("Spring_aop_01.xml"); Sleepable Sleeper = (นอนหลับได้) Ct.GetBean ("Lina"); sleeper.sleep (); } / *** ไฟล์การกำหนดค่า Spring_aop_03.xml คำอธิบายประกอบโดยแง่มุม* / @Test โมฆะสาธารณะทดสอบ 03 () {ApplicationContext CT = ใหม่ classPathxMlApplicationContext ("Spring_aop_03.xml"); Sleepable Sleeper = (นอนหลับได้) Ct.GetBean ("Lina"); sleeper.sleep (); } / *** ไฟล์กำหนดค่า FILE SPRING_AOP_02.XML ไฟล์การกำหนดค่าผ่าน APSECT* @Author Chen Lina* @Version 31 พฤษภาคม 2015 เวลา 10:09:37 น Sleepable Sleeper = (นอนหลับได้) Ct.GetBean ("Lina"); sleeper.sleep (); -
จากคลาสทดสอบเราจะเห็นว่าไม่ว่าเราจะใช้ AOP แบบไหนการใช้งานของพวกเขาก็ไม่แตกต่างกัน ผลลัพธ์ของคลาสทดสอบเหล่านี้เหมือนกัน: