If you do not find what you're looking for, you can use more accurate words.
يعد التجميع يدويًا ب main الرئيسية إحدى طرق تنفيذ حقن التبعية .
public class Injector { public static void main(String[] args) { // Build the dependencies first Service service = new ExampleService(); // Inject the service, constructor style Client client = new Client(service); // Use the objects System.out.println(client.greet()); } }
ينشئ المثال أعلاه الرسم البياني للكائن يدويًا ثم يستدعيه عند نقطة واحدة لبدء العمل. من المهم ملاحظة أن هذا الحاقن ليس نقيًا. يستخدم أحد الكائنات التي يقوم ببنائها. لها علاقة بناء فقط مع ExampleService ولكنها تمزج البناء واستخدام العميل. لا ينبغي أن يكون هذا شائعًا. ومع ذلك، لا مفر منه. تمامًا مثل البرمجيات الموجهة للكائنات تحتاج إلى طريقة ثابتة غير موجهة للكائنات مثل ()main للبدء، يحتاج الرسم البياني للكائن المحقون بالتبعية إلى نقطة إدخال واحدة على الأقل (يفضل واحدة فقط) لبدء كل شيء.
قد لا يكون هذا البناء اليدوي في الطريقة الرئيسية مباشرأ وقد يتضمن استدعاء بناة أو مصانع أو أنماط بناء أخرى أيضًا. يمكن أن يكون هذا متقدمًا ومجرّدًا إلى حد ما. يتم تجاوز الخط من حقن التبعية اليدوي إلى حقن تبعية الإطار بمجرد أن كود البناء لم يعد مخصصًا للتطبيق بل أصبح عالميًا ).
يمكن لإطارات مثل سبرينغ إنشاء هذه الكائنات نفسها وتوصيلها معًا قبل إرجاع مرجع إلى العميل. يمكن نقل جميع الإشارة إلى ExampleService الملموسة من الكود إلى بيانات التكوين.
import org.springframework.beans.factory.BeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Injector { public static void main(String[] args) { // -- Assembling objects -- // BeanFactory beanfactory = new ClassPathXmlApplicationContext("Beans.xml"); Client client = (Client) beanfactory.getBean("client"); // -- Using objects -- // System.out.println(client.greet()); } }
تسمح إطارات مثل سبرينغ بتفريغ تفاصيل التجميع في ملفات التكوين يقوم هذا الكود (أعلاه) ببناء الكائنات توصيلها معًا وفقًا لـ Beans.xml (أدناه). لا تزال خدمة قيد الإنشاء على الرغم من أنها مذكورة أدناه فقط. يمكن تعريف الرسم البياني للكائن الطويل والمعقد بهذه الطريقة، والصنف الوحيد المذكور في الكود ستكون هي صنف طريقة الإدخال، وهي في هذه الحالة (دالة تحية) ()greet.
في المثال أعلاه، لم يكن يتعين على العميل والخدمة الخضوع لأية تغييرات يوزودها إطار سبرينغ. يسمح لهم بالبقاء كبوجو(بالإنجليزية: POJOs ) بسيطة. يوضح هذا كيف يمكن لspring أن يربط الخدمات والعملاء الذين يجهلون تمامًا وجودها. لا يمكن قول ذلك إذا تمت إضافة التعليقات التوضيحية الخاصة بSpring إلى الأصناف. من خلال منع التعليقات التوضيحية الاستدعاءات الخاصة بسبرينغ من الانتشار بين العديد من الأصناف، يظل النظام معتمدًا بشكل فضفاض فقط على سبرينغ. قد يكون هذا مهمًا إذا كان النظام ينوي البقاء على قيد الحياة في سبرينغ. اختيار الحفاظ على POJOs صافية لا يأتي بدون تكلفة. بدلاً من بذل الجهد لتطوير ملفات التكوين المعقدة وصيانتها، من الممكن ببساطة استخدام التعليقات التوضيحية لوضع علامة على الأصناف ) و ترك سبرينغ يقوم بتتمة العمل. يمكن أن يكون حل التبعيات بسيطًا إذا اتبعت المصطلح عليه عادةً مثل المطابقة حسب النوع أو بالاسم. هذا هو اختيار الاصطلاح على التكوين . ويمكن القول أيضًا أنه عند إعادة البناءإلى إطارآخر، فإن إزالة التعليقات التوضيحية المحددة للإطار ستكون جزءًا بسيطًا من المهمة
ويتم الآن توحيد العديد من التعليقات التوضيحية بالحقن.
import org.springframework.beans.factory.BeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Injector { public static void main(String[] args) { // Assemble the objects BeanFactory beanfactory = new AnnotationConfigApplicationContext(MyConfiguration.class); Client client = beanfactory.getBean(Client.class); // Use the objects System.out.println(client.greet()); } }
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @ComponentScan public class MyConfiguration { @Bean public Client client(ExampleService service) { return new Client(service); } }
@Component public class ExampleService { public String getName() { return " } }