هل يؤدي وجود العديد من الحبوب غير المستخدمة في سياق Spring Bean إلى إهدار موارد كبيرة؟

StackOverflow https://stackoverflow.com/questions/98320

  •  01-07-2019
  •  | 
  •  

سؤال

يتم استخدام طبقة النموذج الخاصة بي بواسطة عدد قليل من المشاريع المختلفة وأرغب في استخدام ملف XML Spring Configuration واحد للنموذج بغض النظر عن المشروع الذي يستخدمه.

سؤالي هو:نظرًا لعدم استخدام جميع الفاصوليا في جميع المشاريع، فهل أهدر الموارد بأي قدر كبير إذا لم يتم إنشاء مثيل لها؟لست متأكدًا تمامًا من مدى كسل Spring في تحميلها نظرًا لأنها لم تكن مشكلة حتى الآن.

أيه أفكار؟

هل كانت مفيدة؟

المحلول

مأخوذة من دليل مرجعي الربيع:

السلوك الافتراضي لتطبيقات ApplicationContext هو إنشاء مثيل لكل الفاصوليا المفردة بفارغ الصبر عند بدء التشغيل.يعني الإنشاء المسبق أن ApplicationContext سوف يقوم بشغف بإنشاء وتكوين كافة وحداته المفردة كجزء من عملية التهيئة الخاصة به.يعد هذا أمرًا جيدًا بشكل عام، لأنه يعني أنه سيتم اكتشاف أي أخطاء في التكوين أو في البيئة المحيطة على الفور (بدلاً من احتمالية اكتشافها خلال ساعات أو حتى أيام).

ومع ذلك، هناك أوقات لا يكون فيها هذا السلوك هو المطلوب.إذا كنت لا تريد أن يتم إنشاء مثيل للفاصوليا المفردة مسبقًا عند استخدام ApplicationContext، فيمكنك التحكم في ذلك بشكل انتقائي عن طريق وضع علامة على تعريف الحبة على أنه تمت تهيئته كسولًا.تشير الحبة التي تمت تهيئتها بتكاسل إلى حاوية IoC ما إذا كان يجب إنشاء مثيل الحبة عند بدء التشغيل أم لا أو عند طلبها لأول مرة.

عند تكوين الفول عبر XML، يتم التحكم في هذا التحميل البطيء بواسطة السمة "lazy-init" الموجودة على [bean element] ؛على سبيل المثال:

<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>

ولكن، ما لم تكن وحداتك تستخدم موارد مثل أقفال الملفات أو اتصالات قاعدة البيانات، فلن أقلق كثيرًا بشأن الحمل البسيط للذاكرة إذا كان من الأسهل بالنسبة لك الحصول على هذا التكوين لملفات تعريف متعددة (لكن مختلفة).

نصائح أخرى

بالإضافة إلى التعليقات الأخرى:من الممكن أيضًا تحديد ملف تكوين كامل لتتم تهيئته بتكاسل، باستخدام السمة "default-lazy-init" الموجودة على <beans/> عنصر؛على سبيل المثال:

<beans default-lazy-init="true">
    <!-- no beans will be pre-instantiated... -->
</beans>

وهذا أسهل بكثير من إضافة lazy-init تنسب إلى كل حبة، إذا كان لديك الكثير منها.

بشكل افتراضي، تكون حبوب الربيع مفردة ويتم إنشاء مثيل لها عند إنشاء سياق التطبيق (عند بدء التشغيل).لذا بافتراض أنك لم تقم بتجاوز السلوك الافتراضي، فسيتم إنشاء مثيل واحد لكل حبة.

يعتمد على الكائنات.

لكن الكود غير المستخدم يعد "صعبًا" وسيزيد من تكلفة الصيانة.

من الأفضل حذف المراجع والفئات.يمكنك دائمًا الاستعادة من التحكم في الإصدار إذا كانت هناك حاجة إليها لاحقًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top