บทนำการฉีดขึ้นอยู่กับการพึ่งพา
ลองทบทวนแนวคิดของการฉีดพึ่งพาก่อน:
การฉีดพึ่งพาและการผกผันของการควบคุมซึ่งเรามักจะพูดถึงเป็นแนวคิดเดียวกัน ความหมายเฉพาะคือ: เมื่อบทบาท (อาจเป็นอินสแตนซ์ Java ผู้โทร) ต้องการความช่วยเหลือจากบทบาทอื่น (อินสแตนซ์ Java อื่นผู้โทร) ในกระบวนการเขียนโปรแกรมแบบดั้งเดิมผู้โทรมักจะสร้างขึ้นโดยผู้โทร แต่ในฤดูใบไม้ผลิการทำงานของการสร้าง Callee ไม่ได้ทำโดยผู้โทรอีกต่อไปดังนั้นจึงเรียกว่าการผกผันควบคุม การทำงานของการสร้างอินสแตนซ์ของ Callee มักจะทำโดยภาชนะสปริงแล้วฉีดเข้าไปในผู้โทรดังนั้นจึงเรียกว่าการฉีดพึ่งพา
ในความเป็นจริงแล้วบทบาทของการฉีดพึ่งพาคือการแยกการพึ่งพาระหว่างวัตถุจากรหัสดั้งเดิมและเพื่อเพิ่มการประมวลผลกรอบฤดูใบไม้ผลิเพื่อให้เราสามารถจัดการการพึ่งพาได้อย่างยืดหยุ่นและเป็นศูนย์กลาง
กรอบการฉีดพึ่งพา
กรอบการฉีดพึ่งพาไม่ได้ลึกลับจริง ๆ แล้วมันเป็นเรื่องง่ายมาก อย่าดูซอร์สโค้ดการฉีดพึ่งพาของฤดูใบไม้ผลิเพราะตราบใดที่คุณไปนั่นหมายความว่าคุณจะไม่เขียนอีกครั้งและคุณจะไม่กล้าที่จะเริ่มต้นด้วยตัวเอง ฟังก์ชั่นของมันมีประสิทธิภาพเกินไปดังนั้นการออกแบบจึงซับซ้อนเกินไป โปรแกรมเมอร์ธรรมดาสามารถถอนหายใจได้เมื่อเห็นมัน
ฉันไม่ได้อ่านซอร์สโค้ดสปริงอย่างระมัดระวัง ถึงกระนั้นก็ใช้เวลาเพียงครึ่งวันในการใช้เฟรมเวิร์กเล็ก ๆ ที่ใช้มาตรฐานการฉีดพึ่งพามาตรฐาน "JSR-330" เฟรมเวิร์กขนาดเล็กนี้มีหัวฉีดคลาสหลักเพียงตัวเดียวที่มีรหัสประมาณ 200 บรรทัดและมีฟังก์ชั่นต่อไปนี้
ลองดูตัวอย่างการใช้งานที่ซับซ้อนกว่าเล็กน้อย
นำเข้า javax.inject.inject; นำเข้า Javax.inject.named; นำเข้า Javax.inject.singleton; นำเข้า iockids.injector; @singletonclass root {@inject @named ("a") โหนด a; @Inject @Named ("B") โหนด B; @Override สตริงสาธารณะ toString () {return string.format ("root ( %s, %s)", a.name (), b.name ()); }} node อินเตอร์เฟส {string name ();}@singleton@named ("A") Nodea ใช้โหนด {@Inject Leaf; @Inject @Named ("B") โหนด B; @Override ชื่อสตริงสาธารณะ () {ถ้า (b == null) return string.format ("nodea (%s)", leaf); else return string.format ("nodeawithb (%s)", leaf); }}@singleton@named ("B") คลาส NodeB ใช้โหนด {Leaf leaf; @Inject @Named ("A") Node A; @inject NodeB สาธารณะ (ใบไม้) {this.leaf = leaf; } @Override ชื่อสตริงสาธารณะ () {ถ้า (a == null) return string.format ("nodeB (%s)", leaf); else return string.format ("nodebwitha (%s)", leaf); }} คลาส leaf {@Inject root root; ดัชนี int; ลำดับ int คงที่; ใบสาธารณะ () {index = sequence ++; } สตริงสาธารณะ toString () {ถ้า (root == null) ส่งคืน "leaf" + ดัชนี; อื่น ๆ กลับ "leafwithroot" + ดัชนี; }} การสาธิตคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {var injector = นิวพุทเตอร์ (); injector.registerqualifiedClass (node.class, nodea.class); injector.registerqualifiedClass (node.class, nodeb.class); var root = injector.getInstance (root.class); System.out.println (รูท); -รหัสด้านบนใช้ฟังก์ชั่นทั้งหมดที่จัดทำโดย IOCKIDS
เพื่ออำนวยความสะดวกในการทำความเข้าใจรหัสข้างต้นฉันดึงแผนภาพการพึ่งพา
เอาต์พุตรหัสข้างต้นมีดังนี้
รูท (nodeawithb (leafwithroot0), nodebwitha (leafwithroot1)))
จากผลลัพธ์นี้เรายังสามารถจินตนาการถึงโครงสร้างการพึ่งพาได้อย่างคร่าวๆ
Iockids ให้รายงานข้อผิดพลาดข้อผิดพลาดในการฉีดที่หลากหลายเพื่อป้องกันข้อผิดพลาดการกำหนดค่าการฉีดผู้ใช้
ตัวอย่างเช่นหากเรากำหนดค่าชื่อของ NODEA และ NODEB ด้านบนเป็น A เดียวกันสแต็กข้อผิดพลาดด้านล่างจะถูกเปิดเผย
iockids.injectexception: javax.inject.inject.named ที่มีคลาสเดียวกันกับคลาสเดียวกัน iockids.demo.node ที่ iockids.injector.registerqualifiedclass (injector.java:87) ที่ iockids.injector.registerqualifiedclass iockids.demo.demo.main (demo.java:106)
หากเราเพิ่มพารามิเตอร์ให้กับตัวสร้างของ Nodeb ที่ Will
@Inject NodeB สาธารณะ (ใบไม้ใบไม้, int k) {this.leaf = leaf; -ข้อผิดพลาดต่อไปนี้จะถูกโยนเมื่อทำงาน
iockids.injectException: ไม่มีตัวสร้างที่เข้าถึงได้สำหรับชั้นเรียนฉีด int ที่ iockids.injector.createnew (injector.java:120) ที่ iockids.injector.createnew (injector.java:94) ที่ iockids.injector.createfromparameter iockids.injector.createFromConstructor (injector.java:145) ที่ iockids.injector.createnew (injector.java:123) ที่ iockids.injector.createfromqualified iockids.injector.injectMembers (injector.java:233) ที่ iockids.injector.createnew (injector.java:136) ที่ iockids.injector.createfromqualified (injector.java:216) iockids.injector.injectMembers (injector.java:233) ที่ iockids.injector.createnew (injector.java:136) ที่ iockids.injector.createnew (injector.java:94) ที่ iockids.injector.getinstance iockids.demo.demo.main (demo.java:107)
ที่อยู่โอเพ่นซอร์สโครงการ: https://github.com/pyloque/iockids (ดาวน์โหลดในพื้นที่)
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com