ใครก็ตามที่เรียนรู้กรอบฤดูใบไม้ผลิต้องเคยได้ยินแนวคิดสองแนวคิดของฤดูใบไม้ผลิ: IOC (การผกผันควบคุม) และ DI (การฉีดพึ่งพา) สำหรับผู้ที่ยังใหม่กับฤดูใบไม้ผลิพวกเขามักจะรู้สึกว่าแนวคิดของ IOC และ DI นั้นคลุมเครือและเข้าใจยาก วันนี้ฉันจะแบ่งปันความเข้าใจของผู้เชี่ยวชาญด้านเทคนิคออนไลน์เกี่ยวกับกรอบฤดูใบไม้ผลิ IOC กับคุณและพูดคุยเกี่ยวกับความเข้าใจของฉันเกี่ยวกับฤดูใบไม้ผลิ IOC
IOC คืออะไร
IOC-inversionofcontrol นั่นคือ "การควบคุมการผกผัน" ไม่ใช่เทคโนโลยี แต่เป็นแนวคิดการออกแบบ ในการพัฒนา Java IOC หมายถึงการให้วัตถุที่คุณออกแบบมาเพื่อควบคุมโดยคอนเทนเนอร์แทนที่จะควบคุมพวกมันโดยตรงภายในวัตถุของคุณ
IOC ซึ่งเป็นแกนหลักของฤดูใบไม้ผลิวิ่งผ่านตลอดเวลา สำหรับกรอบฤดูใบไม้ผลิฤดูใบไม้ผลิมีหน้าที่ควบคุมวงจรชีวิตของวัตถุและความสัมพันธ์ระหว่างวัตถุ สิ่งนี้หมายความว่าอย่างไร? เพื่อให้ตัวอย่างง่ายๆเราจะหาแฟนได้อย่างไร? สถานการณ์ทั่วไปคือเราไปทุกที่เพื่อดูว่าเรามีผู้หญิงที่สวยงามและดูดีและสอบถามเกี่ยวกับความสนใจหมายเลข QQ หมายเลขโทรศัพท์หมายเลข IP หมายเลขไอคิว ... หาวิธีทำความรู้จักพวกเขาให้พวกเขาในสิ่งที่พวกเขาชอบแล้วฮิฮิ ... กระบวนการนี้ซับซ้อนและลึกซึ้ง เช่นเดียวกับการพัฒนาโปรแกรมแบบดั้งเดิม ในวัตถุหากคุณต้องการใช้วัตถุอื่นคุณต้องได้รับมัน (ใหม่ด้วยตัวเองหรือสอบถามจาก JNDI) หลังการใช้งานวัตถุจะต้องถูกทำลาย (เช่นการเชื่อมต่อ ฯลฯ ) และวัตถุจะถูกรวมเข้ากับอินเทอร์เฟซหรือคลาสอื่น ๆ เสมอ
จะเข้าใจ IOC ได้อย่างไร? กุญแจสำคัญในการทำความเข้าใจ IOC คือการชี้แจง "ผู้ควบคุมผู้ที่ควบคุมอะไรทำไมมันถึงเป็นการกลับรายการ
●ใครควบคุมใครและอะไร: การออกแบบการเขียนโปรแกรม Javase แบบดั้งเดิมเราสร้างวัตถุโดยตรงผ่านใหม่ภายในวัตถุและโปรแกรมสร้างวัตถุที่ต้องพึ่งพาอย่างแข็งขัน ในขณะที่ IOC มีคอนเทนเนอร์พิเศษเพื่อสร้างวัตถุเหล่านี้นั่นคือคอนเทนเนอร์ IOC จะควบคุมการสร้างวัตถุ ใครควบคุมใคร? แน่นอนว่าคอนเทนเนอร์ IOC ควบคุมวัตถุ; จะควบคุมอะไร? นั่นคือส่วนใหญ่ควบคุมการได้มาของทรัพยากรภายนอก (ไม่ใช่แค่วัตถุรวมถึงไฟล์ ฯลฯ )
●ทำไมมันถึงผกผัน? การผกผันในแง่มุมใด: มีการหมุนในเชิงบวก แอพพลิเคชั่นดั้งเดิมถูกควบคุมอย่างแข็งขันด้วยตัวเองในวัตถุเพื่อให้ได้วัตถุที่พึ่งพาโดยตรงนั่นคือการหมุนในเชิงบวก ในขณะที่การผกผันเป็นคอนเทนเนอร์ที่จะช่วยสร้างและฉีดวัตถุขึ้นอยู่กับ ทำไมมันถึงผกผัน? เนื่องจากคอนเทนเนอร์ช่วยให้เราค้นหาและฉีดวัตถุที่พึ่งพาได้วัตถุเท่านั้นที่ยอมรับวัตถุที่ต้องพึ่งพาอย่างอดทนดังนั้นจึงเป็นการผกผัน การรุกรานคืออะไร? การได้มาของวัตถุที่พึ่งพานั้นกลับด้าน
มาใช้ตำนานเพื่อแสดงให้เห็นว่าการเขียนโปรแกรมแบบดั้งเดิมแสดงในรูปที่ 1-1 ซึ่งสร้างวัตถุที่เกี่ยวข้องอย่างแข็งขันแล้วรวมเข้าด้วยกัน:
รูปที่ 1-1 แผนผังไดอะแกรมของแอปพลิเคชันดั้งเดิม
เมื่อฉันมีคอนเทนเนอร์ IOC/DI วัตถุเหล่านี้จะไม่ถูกสร้างขึ้นในคลาสไคลเอนต์อีกต่อไปดังแสดงในรูปที่ 1-2:
รูปที่ 1-2 แผนผังไดอะแกรมของโครงสร้างโปรแกรมหลังจากคอนเทนเนอร์ IOC/DI มีคอนเทนเนอร์ IOC/DI
1.1.2 IOC ทำอะไรได้บ้าง
IOC ไม่ใช่เทคโนโลยีมันเป็นเพียงความคิดกฎสำคัญของการเขียนโปรแกรมเชิงวัตถุซึ่งสามารถแนะนำเราถึงวิธีการออกแบบคู่ที่ดีและดีกว่า แอปพลิเคชั่นดั้งเดิมทั้งหมดถูกสร้างขึ้นอย่างแข็งขันโดยเราภายในชั้นเรียนซึ่งนำไปสู่การมีเพศสัมพันธ์สูงระหว่างชั้นเรียนและยากต่อการทดสอบ ด้วยคอนเทนเนอร์ IOC การควบคุมการสร้างและค้นหาวัตถุที่พึ่งพาจะถูกส่งไปยังภาชนะบรรจุและคอนเทนเนอร์ฉีดวัตถุรวมดังนั้นวัตถุนั้นจะถูกคู่กันอย่างหลวม ๆ ซึ่งสะดวกสำหรับการทดสอบ
ในความเป็นจริงการเปลี่ยนแปลงที่ยิ่งใหญ่ที่สุดที่ IOC นำมาสู่การเขียนโปรแกรมไม่ได้มาจากรหัส แต่มาจากมุมมองทางอุดมการณ์และการเปลี่ยนแปลงของ แอปพลิเคชันเดิมเป็นเจ้านายและเขาใช้ความคิดริเริ่มเพื่อรับทรัพยากรใด ๆ อย่างไรก็ตามในแนวคิด IOC/DI แอปพลิเคชันกลายเป็นแบบพาสซีฟและเขาก็รอคอนเทนเนอร์ IOC อย่างอดทนเพื่อสร้างและฉีดทรัพยากรที่จำเป็น
IOC สะท้อนให้เห็นถึงกฎข้อหนึ่งของการออกแบบเชิงวัตถุ - กฎฮอลลีวูด: "อย่ามองหาเราเราจะมองหาคุณ"; นั่นคือคอนเทนเนอร์ IOC ช่วยให้วัตถุค้นหาวัตถุที่ขึ้นอยู่กับที่สอดคล้องกันและฉีดมันแทนที่จะมองหาวัตถุอย่างแข็งขัน
1.1.3 IOC และ DI
Di-dependencyinjecting นั่นคือ "การฉีดพึ่งพา": การพึ่งพาระหว่างส่วนประกอบจะถูกกำหนดโดยคอนเทนเนอร์ในระหว่างการรันไทม์ ในรูปแบบคอนเทนเนอร์แบบไดนามิกจะฉีดพึ่งพาบางอย่างลงในส่วนประกอบ วัตถุประสงค์ของการฉีดพึ่งพาไม่ได้นำฟังก์ชั่นเพิ่มเติมมาสู่ระบบซอฟต์แวร์ แต่เพื่อเพิ่มความถี่ของการใช้ส่วนประกอบซ้ำและสร้างแพลตฟอร์มที่ยืดหยุ่นและปรับขนาดได้สำหรับระบบ ผ่านกลไกการฉีดขึ้นอยู่กับการพึ่งพาเราจำเป็นต้องระบุทรัพยากรที่ต้องการโดยเป้าหมายโดยไม่มีรหัสใด ๆ เพื่อให้ตรรกะทางธุรกิจของเราเสร็จสมบูรณ์ผ่านการกำหนดค่าอย่างง่ายโดยไม่ต้องดูแลว่าทรัพยากรเฉพาะมาจากที่ใด
หนึ่งในประเด็นสำคัญของ IOC คือการจัดหาวัตถุกับวัตถุอื่น ๆ ที่ต้องการในระหว่างการทำงานของระบบ นี่คือความสำเร็จผ่าน DI (การฉีดพึ่งพา) ตัวอย่างเช่นวัตถุ A จำเป็นต้องใช้ฐานข้อมูล ในอดีตเรามักจะเขียนโค้ดใน A เพื่อรับวัตถุการเชื่อมต่อ ด้วยฤดูใบไม้ผลิเราต้องบอกสปริงว่าจำเป็นต้องมีการเชื่อมต่อใน A สำหรับวิธีการสร้างการเชื่อมต่อนี้และเมื่อใดที่จะสร้างมันไม่จำเป็นต้องรู้ เมื่อระบบทำงานสปริงจะสร้างการเชื่อมต่อในเวลาที่เหมาะสมจากนั้นฉีดเข้าไปในการฉีดเช่นเดียวกับการควบคุมความสัมพันธ์ระหว่างแต่ละวัตถุ ความต้องการที่จะพึ่งพาการเชื่อมต่อเพื่อทำงานตามปกติและการเชื่อมต่อนี้จะถูกฉีดเข้าไปในฤดูใบไม้ผลิและชื่อของการฉีดพึ่งพามาจากสิ่งนี้ แล้ว DI ถูกนำไปใช้อย่างไร? คุณสมบัติที่สำคัญหลังจาก Java 1.3 คือการสะท้อนกลับซึ่งช่วยให้โปรแกรมสามารถสร้างวัตถุแบบไดนามิกดำเนินการวิธีการวัตถุและเปลี่ยนคุณสมบัติของวัตถุเมื่อทำงาน ฤดูใบไม้ผลิถูกฉีดผ่านการสะท้อน
กุญแจสำคัญในการทำความเข้าใจ DI คือ: "ใครขึ้นอยู่กับว่าใครทำไมคุณต้องพึ่งพามันใครจะฉีดใครและอะไรฉีดมัน" มาวิเคราะห์ในเชิงลึก:
●ใครขึ้นอยู่กับว่าใคร: แน่นอนแอปพลิเคชันขึ้นอยู่กับคอนเทนเนอร์ IOC;
●เหตุใดจึงจำเป็นต้องมีการพึ่งพา: แอปพลิเคชันจำเป็นต้องมีคอนเทนเนอร์ IOC เพื่อจัดหาทรัพยากรภายนอกที่ต้องการโดยวัตถุ
●ผู้ที่ฉีดใคร: เห็นได้ชัดว่าคอนเทนเนอร์ IOC ฉีดวัตถุของแอปพลิเคชันวัตถุที่แอปพลิเคชันขึ้นอยู่กับ;
●สิ่งที่ถูกฉีด: มันคือการฉีดทรัพยากรภายนอก (รวมถึงวัตถุทรัพยากรและข้อมูลคงที่) ที่จำเป็นสำหรับวัตถุ
ความสัมพันธ์ระหว่าง IOC และ DI คืออะไร? ในความเป็นจริงพวกเขาอธิบายจากมุมที่แตกต่างจากแนวคิดเดียวกัน เนื่องจากแนวคิดของการผกผันควบคุมค่อนข้างคลุมเครือ (อาจเป็นที่เข้าใจกันว่าเป็นระดับของวัตถุควบคุมคอนเทนเนอร์จึงเป็นเรื่องยากที่จะคิดว่าใครจะรักษาความสัมพันธ์ของวัตถุ) ในปี 2004 มาร์ตินฟาวเลอร์มาสเตอร์ให้ชื่อใหม่: "การฉีดพึ่งพาอาศัย" เมื่อเทียบกับ IOC "การฉีดพึ่งพา" อธิบายอย่างชัดเจน "วัตถุที่ฉีดขึ้นอยู่กับวัตถุการพึ่งพาการกำหนดค่าคอนเทนเนอร์ IOC"
สรุป
ในความเป็นจริงทุกคนมีความเข้าใจในแนวคิดของฤดูใบไม้ผลิ IOC และไม่มีคำตอบมาตรฐาน ทิศทางทั่วไปนั้นถูกต้อง
ข้างต้นคือทั้งหมดที่เกี่ยวกับความเข้าใจการฉีดพึ่งพาและการผกผันในการควบคุมในฤดูใบไม้ผลิ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!