ฤดูใบไม้ผลิเป็นเฟรมเวิร์กโอเพนซอร์สที่ใช้สองสิ่งส่วนใหญ่คือ IOC (การผกผันควบคุม) และ AOP (การเขียนโปรแกรมแบบแยกส่วน)
IOC
การควบคุมการผกผันหรือที่เรียกว่าการผกผันของการพึ่งพา
การพึ่งพาที่เรียกว่าจากมุมมองของโปรแกรมหมายความว่าตัวอย่างเช่นหาก A ต้องการเรียกวิธีการของ B แล้ว A ขึ้นอยู่กับ B ต่อไปถ้า A ต้องการใช้ B ขึ้นอยู่กับ B. การผกผันที่เรียกว่าคุณต้องเข้าใจว่าจะเกิดอะไรขึ้น เพื่อให้ได้อินสแตนซ์ B (แน่นอนมีรูปแบบการออกแบบที่หลากหลายที่สามารถช่วยให้คุณได้รับอินสแตนซ์ B เช่นโรงงานตัวระบุตำแหน่ง ฯลฯ ) จากนั้นคุณสามารถเรียกวัตถุ B ได้ ดังนั้นการไม่กลับด้านหมายความว่าจะต้องได้รับ B ก่อนที่จะใช้ B; ณ จุดนี้คุณควรเข้าใจความหมายของการคว่ำ การพลิกกลับหมายความว่าหาก A ต้องการโทร B ไม่จำเป็นต้องได้รับ B อย่างแข็งขัน แต่คนอื่น ๆ จะส่ง B ไปที่ประตูโดยอัตโนมัติ
การพลิกกลับที่เรียกว่าการควบคุมคือการถ่ายโอนกำลังควบคุม เพื่อให้ตัวอย่าง: หากบุคคลต้องการขับรถภายใต้สถานการณ์ปกติบุคคลควรมองหารถด้วยตัวเอง หลังจากการพลิกกลับการควบคุมนั้นไม่จำเป็นต้องพิจารณาว่ารถมาจากไหนเพียงแค่ขับโดยตรงและบุคคลที่โอนการควบคุมรถไปยังวัตถุอื่น ๆ สัมผัสกับรหัสต่อไปนี้
กำหนดรถอินเทอร์เฟซ
รถยนต์อินเทอร์เฟซสาธารณะ {void go ();}กำหนดรถยนต์สองประเภท
ชั้นเรียนสาธารณะ Benz ใช้รถยนต์ {โมฆะสาธารณะไป () {system.out.println ("Benz Go ... "); }} คลาสสาธารณะ BMW ใช้รถยนต์ {โมฆะสาธารณะไป () {System.out.println ("BMW GO ... "); -ด้านล่างคือการขับขี่
บุคคลชั้นเรียนสาธารณะ {Car Car = New Benz (); เป็นโมฆะ drivecar () {system.out.println ("เริ่มต้นไดรฟ์"); car.go (); -นี่เป็นกระบวนการควบคุมรหัสปกติ หากคุณต้องการขับรถคุณต้องทำอินสแตนซ์รถยนต์ด้วยตัวเอง อย่างไรก็ตามในกรณีนี้บุคคลนี้สามารถขับรถคันเดียวเท่านั้น คนนี้สามารถขับรถต่าง ๆ ได้อย่างไร? มันคือการบรรลุการกลับรายการควบคุม กล่าวอีกนัยหนึ่งถ้าบุคคลนั้นไม่ได้ทำให้รถตัวเองพิงตัวเองอีกต่อไปบุคคลนั้นจะได้รับวัตถุของรถได้อย่างไร? เราสามารถใช้การฉีดพึ่งพา (DI สั้น ๆ ) เพื่อรับวัตถุของรถยนต์ซึ่งจะบรรลุการผกผันควบคุม ดังนั้นเราจำเป็นต้องปรับเปลี่ยนคลาสบุคคล
บุคคลชั้นเรียนสาธารณะ {Car Car = Null; บุคคลสาธารณะ (รถยนต์รถยนต์) {this.car = Car; } void drivecar () {system.out.println ("เริ่มต้นไดรฟ์"); car.go (); -คลาสบุคคลปัจจุบันไม่ได้สร้างอินสแตนซ์วัตถุของรถเองอีกต่อไป แต่ใช้ตัวสร้างเพื่อรับวัตถุของรถยนต์ ดังนั้นคลาสนี้สามารถขับเคลื่อนรถยนต์ต่าง ๆ ได้ตราบใดที่รถใช้อินเทอร์เฟซรถยนต์ ดูวิธีการใช้คลาสบุคคล
โมฆะคงที่สาธารณะหลัก (String [] args) {person p = บุคคลใหม่ (ใหม่ benz ()); p.drivecar ();}คลาสบุคคลสามารถขับรถมากกว่าหนึ่งประเภทได้ตราบใดที่คุณผ่านผ่านตัวสร้าง ในตัวอย่างนี้วัตถุรถยนต์คือการพึ่งพาของคลาสบุคคล เมื่อเราสร้างอินสแตนซ์คลาสบุคคลผ่านอินสแตนซ์ของรถไปยังชั้นเรียนบุคคลคือการฉีดขึ้นอยู่กับการพึ่งพา คลาสบุคคลของเราจึงใช้การควบคุมการผกผัน
การพลิกกลับแบบย้อนกลับของการควบคุมคืออะไร? มีคำกล่าวว่า: การผกผันที่เรียกว่าการควบคุมเป็นกระบวนการของการได้รับการพึ่งพาวัตถุ หลังจากสิทธิ์ในการควบคุมกลับด้านกระบวนการของการได้รับวัตถุที่พึ่งพาเปลี่ยนจากการจัดการของตัวเองเป็นการฉีดโดยคอนเทนเนอร์ IOC
สปริงดำเนินการฉีดพึ่งพา
ในบรรทัดของรหัสข้างต้นบุคคล p = บุคคลใหม่ (New Benz ());, เราใหม่ด้วยตนเอง A Benz () วัตถุและฉีดเข้าไปในชั้นเรียนบุคคล ฤดูใบไม้ผลิไม่ได้ทำเช่นนี้เพราะฤดูใบไม้ผลิรู้สึกว่าบรรทัดรหัสของคุณสร้างคลาสเบนซ์ที่เฉพาะเจาะจง หากคุณต้องการยกตัวอย่างคลาส BMW ที่นี่ในอนาคตคุณไม่จำเป็นต้องแก้ไขรหัสหรือไม่? จากนั้นฉันจะเขียนมันในไฟล์การกำหนดค่า แม้ว่าคุณจะต้องให้ความสนใจในอนาคตอย่างน้อยคุณก็ไม่จำเป็นต้องแก้ไขรหัสดังนั้นการกำหนดค่าต่อไปนี้จึงมีอยู่
<ถั่ว> <bean id = "car" /> <bean id = "person"> <property name = "car" ref = "car" /> <bean /> </ebeans>
จากนั้นฤดูใบไม้ผลิให้กลไกบางอย่าง เมื่อได้รับวัตถุคลาสบุคคลจากไฟล์การกำหนดค่าวัตถุรถยนต์ที่เข้ามาจะถูกรวบรวมและวัตถุบุคคลไม่จำเป็นต้องกังวลเกี่ยวกับคลาสที่เฉพาะเจาะจงที่ผ่านเข้ามาดังนั้นฤดูใบไม้ผลิเป็นกรอบ IOC ส่วนใหญ่ใช้สองขั้นตอน: การสร้างวัตถุและประกอบความสัมพันธ์ระหว่างวัตถุ
AOP
AOP (การเขียนโปรแกรมที่มุ่งเน้นด้าน) คือการเขียนโปรแกรมที่มุ่งเน้นด้าน ให้ฉันยกตัวอย่างสิ่งที่เป็น ในโครงการเว็บไซต์ที่สมบูรณ์ต้องมีการบันทึกโมดูลหลายแห่งสถานที่หลายแห่งต้องเข้าสู่ระบบและหลาย ๆ แห่งจำเป็นต้องมีการจัดการข้อยกเว้น การบันทึกการบันทึกการจัดการข้อยกเว้นและ logics อื่น ๆ เป็นส่วนที่เรียกว่า สมมติว่าฉันเขียนตรรกะของส่วนเหล่านี้ทุกที่จากนั้นความสามารถในการบำรุงรักษาของรหัสสามารถจินตนาการได้ AOP คือการบรรลุการแยกข้อกังวลแยกตรรกะของส่วนเหล่านี้และเขียนลงในชั้นเรียนแยกต่างหากจากนั้นหาวิธีที่จะรวบรวมพวกเขาด้วยโมดูลทั่วไปเพื่อดำเนินการ โมดูลสามัญไม่ทราบด้วยซ้ำว่าพวกเขาได้รวบรวมไว้ในส่วนและส่วนต่างๆ
เป้าหมายของการเขียนโปรแกรมที่มุ่งเน้นด้านต่าง ๆ คือการแยกโฟกัส โฟกัสคืออะไร? มันคือสิ่งที่คุณต้องทำมันเป็นจุดสนใจ หากคุณเป็นชายหนุ่มและไม่มีเป้าหมายในชีวิตคุณเพียงแค่ต้องสวมใส่เสื้อผ้าและกินและคุณรู้เพียงสิ่งเดียวที่จะเล่นทั้งวัน! ดังนั้นทุกวันเมื่อคุณลืมตาคุณแค่อยากไปเล่นหลังอาหารเย็น (สิ่งที่คุณต้องทำ) แต่ก่อนที่จะเล่นคุณต้องสวมใส่เสื้อผ้าสวมรองเท้าผ้าห่มพับทำอาหาร ฯลฯ สิ่งเหล่านี้เป็นจุดสนใจของคุณ แต่คุณแค่อยากกินและเล่น ทุกสิ่งเหล่านี้ถูกทิ้งให้ผู้อื่นทำ ก่อนที่คุณจะเดินไปที่โต๊ะรับประทานอาหารมีคนรับใช้พิเศษเพื่อช่วยคุณแต่งตัวคนรับใช้ B เพื่อช่วยให้คุณสวมรองเท้าคนรับใช้ C เพื่อช่วยคุณพับผ้าห่มคนรับใช้ C เพื่อช่วยคุณทำอาหารจากนั้นคุณก็เริ่มกินและเล่น (นี่คือธุรกิจประจำวันของคุณ) หลังจากเสร็จสิ้นวันของคุณกลับมาและชุดของคนรับใช้เริ่มช่วยให้คุณทำสิ่งนี้และจากนั้นวันนั้นก็จบลง!
ข้อได้เปรียบของ AOP คือคุณต้องทำธุรกิจที่สำคัญของคุณและคนอื่น ๆ จะช่วยคุณในสิ่งอื่น ๆ บางทีวันหนึ่งถ้าคุณต้องการที่จะเปลือยกายและไม่ต้องการสวมใส่เสื้อผ้าคุณก็แค่ยิงคนรับใช้ของคุณ! บางทีวันหนึ่งคุณต้องการนำเงินมาก่อนออกไปดังนั้นคุณสามารถจ้างคนรับใช้อีกคนหนึ่งเพื่อช่วยให้คุณได้รับเงิน! นี่คือ AOP ทุกคนปฏิบัติหน้าที่ของตนเองและรวมกันอย่างยืดหยุ่นเพื่อให้ได้โครงสร้างโปรแกรมที่สามารถกำหนดค่าได้
จากมุมมองของฤดูใบไม้ผลิจุดประสงค์ที่ใหญ่ที่สุดของ AOP คือการให้ความสามารถในการจัดการธุรกรรม การจัดการธุรกรรมเป็นจุดสนใจ ธุรกิจของคุณคือการเข้าถึงฐานข้อมูลและคุณไม่ต้องการจัดการธุรกรรม (น่ารำคาญเกินไป) ดังนั้นสปริงจะเริ่มการทำธุรกรรมโดยอัตโนมัติก่อนที่คุณจะเข้าถึงฐานข้อมูลและจะส่ง/ย้อนกลับธุรกรรมให้คุณโดยอัตโนมัติหลังจากเข้าถึงฐานข้อมูล!
ดูรหัสต่อไปนี้ไม่สำคัญว่าคุณจะไม่เข้าใจ
<bean id = "ผู้ชม" /> <aop: config> <aop: ref = "ผู้ชม"> <aop: pointcut id = "ประสิทธิภาพ" expression = "การดำเนินการ (* com.springinaction.springidol.performer.perform (.. ) <AOP: ก่อน PointCut-ref = "performance" method = "turnoffcellphones" /> <!-<co id = "co_refpointcut" />-> <aop: การคืนค่า pointcut-ref = "ประสิทธิภาพ" method = "demandrefund"/> <!-<co id = "co_refpointcut"/>-> </aop: แง่มุม> </aop: config>
ความหมายคร่าวๆของการกำหนดค่าข้างต้นคือเมื่อวิธีการแสดงผลการดำเนินงานกำลังจะเกิดขึ้นพร็อกซีในกรอบสปริงจะสกัดกั้นวิธีการเป้าหมาย (prover.per.perform ()) ก่อนที่จะดำเนินการวิธีการเป้าหมายก่อนอื่นให้ดำเนินการ method.takeseats () และ Audienceturn.offcellphones () จากนั้นเรียกใช้วิธีเป้าหมาย เมื่อวิธีการเป้าหมายถูกดำเนินการและส่งคืนให้เรียกใช้วิธี AudienCeturn.applaud () หากวิธีเป้าหมายน่าเสียดายที่มีข้อยกเว้นเอเจนต์จะเรียกใช้วิธี AudienCeturn.DemandRefund () ในระยะสั้นพร็อกซีคลาสของฤดูใบไม้ผลิจะตรวจสอบการดำเนินการของวิธีการเป้าหมายในทุกด้านในขณะที่วิธีการเป้าหมายจะมุ่งเน้นไปที่กิจการของตัวเองเท่านั้นและไม่รู้จักการมีอยู่ของพร็อกซีคลาส
สรุป
ข้างต้นคือทั้งหมดที่เกี่ยวกับความเข้าใจที่เรียบง่ายของตัวอย่าง IOC, AOP และรหัสของฤดูใบไม้ผลิ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงเว็บไซต์นี้ต่อไปได้:
การแนะนำอย่างละเอียดเกี่ยวกับการใช้งานการจำลอง IOC ของฤดูใบไม้ผลิ
Spring AOP Intercept-สามวิธีในการใช้คำอธิบายรายละเอียดพร็อกซีอัตโนมัติ
หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!