مقدمة الحقن التبعية
دعنا أولاً نراجع مفهوم حقن التبعية:
حقن التبعية وانعكاس السيطرة ، والتي نذكرها غالبًا هي نفس المفهوم. المعنى المحدد هو: عندما يحتاج دور (ربما مثيل Java ، المتصل) إلى مساعدة من دور آخر (مثيل Java آخر ، المتصل) ، في عملية البرمجة التقليدية ، يتم إنشاء المتصل عادةً من قبل المتصل. ولكن في فصل الربيع ، لم يعد عمل إنشاء Callee من قبل المتصل ، لذلك يطلق عليه انعكاس التحكم ؛ عادةً ما يتم إجراء عملية إنشاء مثيل Callee بواسطة حاوية الربيع ثم حقنها في المتصل ، لذلك يطلق عليه أيضًا حقن التبعية.
في الواقع ، ببساطة ، فإن دور حقن التبعية هو فصل التبعيات بين الكائنات من الكود الأصلي ، وإضافة معالجة إطار عمل الربيع للسماح لنا بإدارة التبعيات بمرونة ومركزية.
إطار حقن التبعية
إطار حقن التبعية ليس غامضًا ، إنه في الواقع أمر بسيط للغاية. لا تنظر إلى رمز مصدر حقن التبعية في الربيع ، لأنه طالما ذهبت ، فهذا يعني أنك لن تكتب مرة أخرى ولن تجرؤ على البدء بنفسك. وظيفتها قوية للغاية ، لذلك التصميم معقد للغاية. لا يمكن للمبرمجين العاديين أن تنهد إلا على مرأى من ذلك.
لم أقرأ رمز مصدر الربيع بعناية. ومع ذلك ، استغرق الأمر نصف يوم فقط لتطبيق إطار عمل صغير يفي بمعيار حقن التبعية القياسي "JSR-330". يحتوي هذا الإطار الصغير على حاقن فئة رئيسي واحد فقط ، مع حوالي 200 سطر من التعليمات البرمجية ، ولديه الوظائف التالية.
دعونا نلقي نظرة على مثال أكثر تعقيدًا قليلاً للاستخدام
استيراد javax.inject.inject ؛ import javax.inject.named ؛ import javax.inject.singleton ؛ import iockids.injector ؛ singletonclass root { @ @named ("a") العقدة a ؛ @injectnednamed ("b") العقدة B ؛ Override public string toString () {return string.format ("root (٪ s ، ٪ s)" ، a.name () ، b.name ()) ؛ }} واجهة عقدة {string name () ؛}@singleton@named ("a") class nodea تنفذ node {inject leaf ؛ @injectnednamed ("b") العقدة B ؛ Override public string name () {if (b == null) return string.format ("nodea (٪ s)" ، Leaf) ؛ else return string.format ("nodeawithb (٪ s)" ، Leaf) ؛ }}@singleton@name ("b") class nodeb تنفذ العقدة {Leaf Leaf ؛ inject @named ("a") العقدة A ؛ @inject public nodeb (ورقة ورقة) {this.leaf = leaf ؛ } Override public string name () {if (a == null) return string.format ("nodeb (٪ s)" ، Leaf) ؛ else return string.format ("nodebwitha (٪ s)" ، Leaf) ؛ }} ورقة الفئة {inject root root ؛ مؤشر int ؛ تسلسل int ثابت. Public Leaf () {index = sequence ++ ؛ } السلسلة العامة tostring () {if (root == null) إرجاع "Leaf" + index ؛ عودة أخرى "Leafwithroot" + INDEX ؛ }} demo class public {public static void main (string [] args) {var enjector = new countor () ؛ enjector.registerqualifiedClass (node.class ، nodea.class) ؛ enjector.registerqualifiedClass (node.class ، nodeb.class) ؛ var root = enjector.getInstance (root.class) ؛ system.out.println (root) ؛ }}يستخدم الرمز أعلاه جميع الوظائف التي توفرها Iockids.
لتسهيل فهم الكود أعلاه ، رسمت مخطط التبعية
إخراج الرمز أعلاه كما يلي
الجذر (nodeawithb (leafwithroot0) ، nodebwitha (leafwithroot1))
من هذا المخرج ، يمكننا أيضًا تخيل بنية التبعية تقريبًا.
يوفر IOCKIDs تقارير استثناء خطأ في الحقن لمنع أخطاء تكوين حقن المستخدم.
على سبيل المثال ، إذا قمنا بتكوين أسماء Nodea و NodeB أعلاه إلى نفس A ، فسيتم تعريض مكدس الخطأ أدناه.
iockids.injectexception: Javax.injected المؤهلين. iockids.demo.demo.main (Demo.java:106)
إذا أضفنا معلمة إلى مُنشئ NodeB في الإرادة
inject public nodeb (ورقة ورقة ، int k) {this.leaf = leaf ؛ }سيتم طرح الخطأ التالي عند التشغيل
Iockids.InjectException: لا يوجد مُنشئ يمكن الوصول إليه لفئة الحقن int في iockids.injector.createNew (enjector.java:120) في iockids.injector.createNew (enjector.java:94) في iockids.injector.createfromparameter iockids.injector.createfromconstructor (enjector.java:145) at iockids.injector.createenew (enjector.java:123) في iockids.injector.createfromqualified (enjector.java:216) at iockids.injector.createffield iockids.injector.injectmembers (java.java:233) في iockids.injector.createNew (enjector.java:136) في iockids.injector.creatfromqualified (enjector.java:216) iockids.injector.injectmembers (java.java:233) في iockids.injector.createNew (java.java:136) في iockids.injector.createNew (enjector.java:94) iockids.demo.demo.main (Demo.java:107)
عنوان المصدر المفتوح للمشروع: https://github.com/pyloque/iockids (التنزيل المحلي)
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.