1. حقن التبعية (DI)
يبدو أن حقن التبعية عميقًا للغاية ، ولكن في الواقع هو: تعيين القيم للسمات. هناك طريقتان في المجموع. الأول هو في شكل معلمات مُنشئ ، والآخر في شكل طريقة إعداد.
1 حقن مُنشئ
1 حقن باستخدام المنشئ
طريقة الحقن باستخدام XML
أ. ترتيب المعلمات
<Bocattructor-ARG INDEX = "0"> <Value> Zhang San </value> </constructor-arg>
<بنشينة arg index = "1"> <value> 56 </value> </constructor-arg>
B. نوع المعلمة
<constructor-arg type = "java.lang.integer"> <value> 56 </value> </structructor-arg>
<constructor-arg type = "java.lang.string"> <value> Zhang San </value> </structructor-arg>
أمثلة محددة
إذا كنت ترغب في ضخ المعلمات في فصل الشخص الآن ، فإن الطالب هو فصل آخر.
شخص الطبقة العامة {private string pid ؛ اسم السلسلة الخاصة ؛ طالب خاص ؛ الشخص العام (سلسلة PID ، الطالب) {this.pid = pid ؛ this.student = الطالب ؛ } الشخص العام (سلسلة pid ، اسم السلسلة) {this.pid = pid ؛ this.name = name ؛ }}تكوين ApplicationContext.xml. إذا لم يتم إجراء تكوين معلمة ، فسيتم الإبلاغ عن خطأ ولا يمكن العثور على المنشئ المقابل. إذا تم تكوين المعلمات المقابلة ، فيجب إعلان المنشئ المقابل في الفصل.
<؟ XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5 فهرس المعلمة من مُنشئ في فئة الشخص هو علامة زاوية المعلمة. قيمة نوع المعلمة. إذا كانت خاصية أساسية ، فاستخدم مرجع التخصيص هذا للإشارة إلى Type Tission-> <constructor-arg index = "0" type = "java.lang.String" value = "aaa"> </constructor-arg> <bustructor-arg index = "1" "ref =" ref = "/bocattructor-arg> </ bean> value = "1"> </sprenteration> </bean> <bean id = "student"
اكتب فئة الاختبار dixmlconstructortest وأداء تصحيح تصحيح نقطة التوقف. ستجد أنه وفقًا لمعلمات التكوين ، فإن المُنشئ الذي تم إدخاله هو الشخص (سلسلة PID ، طالب الطالب)
الفئة العامة dixmlConstructorTest {test public void test1 () {applicationContext context = new ClassPathxMlActionContext ("ApplicationContext.xml") ؛ شخص الشخص = (شخص) سياق. getBean ("شخص") ؛ }}2 الحقن باستخدام طريقة setter الخاصية
طريقة الحقن باستخدام XML:
A. حقن الفاصوليا البسيطة تتضمن الفاصوليا البسيطة نوعين: نوع التغليف والسلسلة
<bean id = "personservice"> <!-النوع الأساسي ، نوع السلسلة-> <property name = "Age" value = "20"> </property> <property name = "name" value = "zhang wuji"
ب. اقتبس من الفاصوليا الأخرى
<bean id = "person" /> <bean id = "personservice"> <property name = "person" ref = "person" /> < /bean>
1.1 مجموعة قائمة التجميع
<property name = "lists"> <list> <value> list1 </value> <value> list2 </value>
1.2 مجموعة مجموعة التجميع
<property name = "sets"> <tev> <value> list1 </value> <value> list2 </value>
1.3 خريطة التجميع
<property name = "maps"> <map> <intply key = "01"> <value> map01 </value> </truction> <intply key = "02"
قيمة <REFTRING> في الخريطة هي نفس قيمة <LIST> و <ST> ، والتي يمكن أن تجعل أي عنصر سمة صالح. تجدر الإشارة إلى أن قيمة المفتاح يجب أن تكون سلسلة.
1.4 خصائص التجميع
<property name = "props"> <bors> <prop key = "01"> prop1 </prop> <prop key = "02"> prop2 </props> </props> </property>
أمثلة محددة
1. إنشاء شخصين وطالب
package xgp.spring.demo ؛ import java.util.list ؛ import java.util.map ؛ import java.util.properties ؛ import java.util.set ؛ public class person {private string pid ؛ اسم السلسلة الخاصة ؛ طالب خاص ؛ قوائم قائمة خاصة ؛ مجموعات خاصة ؛ خريطة خريطة خاصة ؛ خصائص الخصائص الخاصة ؛ كائن خاص [] كائنات ؛ Public Person () {system.out.println ("شخص جديد") ؛ } // حذف أساليب getter و setter} Package XGP.Spring.demo ؛ طالب الطبقة العامة {public student () {system.out.println ("New Student") ؛ } public void says () {system.out.println ("student") ؛ }}تكوين ملف ApplicationContext.xml
<؟ XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/schema/beans/spring-beans-2.5. إذا كان الخاصية نوع مرجع ، فاستخدم Ref لتعيين القيمة-> <bean id = "person" init-method = "init" lazy-init = "true"> <property name = "pid" value = "1"> </spleneration> <property name = "name" value = "wang ermazi"> </spleneration> propert <Value> list2 </value> <ref bean = "student"/> </property> <property name = "sets"> <set> <value> set1 </value> <value> set2 </value> bean = "student"/> </terput> </map> </property> <property name = "properties"> <bors> <!-لا يوجد نوع مرجع مطلوب-> <prop key = "prop1"> prop1 </prop> <prop key = "prop2"> prop2 </props> </props> </propert </spreents> </boen> <bean id = "student"> </bean> </bans>
اكتب فئة اختبار dixmlsettertest
Package XGP.Spring.test ؛ استيراد org.junit.test ؛ استيراد org.springframework.context.applicationContext ؛ استيراد org.springframework.context.support.classpathxmlicationContext هل: * 1. ماذا تفعل حاوية الربيع؟ (1) ابدأ حاوية الزنبرك* (2) قم بإنشاء كائن لفاصلين من الشخص والطالب* (3) قم بتحليل سمة الاسم الخاصة بالخاصية ، وقم بتوصيل طريقة setter ، وتحليل قيمة* أو سمات المرجع للخاصية ، ونقل المعلمات إلى طريقة Setter ، واستخدام تقنية الانعكاس لتعيين القيم إلى الكائن. * (4) استخراج الكائن من حاوية الزنبرك واستدعاء طريقة الكائن. * 2. ما هو ترتيب تنفيذ حاويات الربيع؟ */ test public void test1 () {applicationContext context = new ClassPathxMlAppLicationContext ("ApplicationContext.xml") ؛ شخص الشخص = (شخص) سياق. getBean ("شخص") ؛ system.out.println (person.getPid ()) ؛ System.out.println (person.getName ()) ؛ system.out.println (person.getLists ()) ؛ system.out.println (person.getSets ()) ؛ System.out.println (person.getMap ()) ؛ System.out.println (person.getObjects (). الطول) ؛ }}/*1 wang wu [list1 ، list2 ، xgp.spring.demo.student@76a9b9c] [set1 ، set2 ، xgp.spring.demo.student@76a9b9c] ترتيب تنفيذ حاويات الربيع
1. جميع الإعدادات الافتراضية
2. تعيين الطالب (Lazy-Init = True)
3. تعيين الشخص (Lazy-Init = True)
لخص
هناك طريقتان لحقن المعلمات. يحتاج المُنشئ إلى كتابة المُنشئ المقابل ، ويحتاج Setter إلى إنشاء طريقة Setter المقابلة ، ويتم كتابة المنشئ الافتراضي.
2.5 أهمية IOC و DI
بعد تعلم هذه ، ما معنى اكتشافها؟ دعنا نكتب مثالا على نظام إدارة المستندات لتوضيح المتطلبات. انظر الشكل أدناه
1. اكتب واجهة المستند
وثيقة الواجهة العامة {public void read () ؛ الفراغ العام الكتابة () ؛}2. اكتب فئات التنفيذ WordDocument ، Exceldocument ، PDFDOCUMITY
الطبقة العامة WordDocument تنفذ المستند {public void read () {system.out.println ("Word read") ؛ } public void write () {system.out.println ("word write") ؛ }}3. اكتب نظام إدارة المستندات
Document Public Class {وثيقة وثيقة خاصة ؛ public void setDocument (وثيقة المستند) {this.document = document ؛ } public documentManager () {} public documentManager (وثيقة المستند) {super () ؛ this.document = وثيقة ؛ } public void read () {this.document.read () ؛ } public void write () {this.document.write () ؛ }}4. اكتب اختبار مستند فئة الاختبار
/*** باستخدام IOC و DI ، يمكنك تحقيق البرمجة الكاملة الموجهة للواجهة** /documenttest class public { /*** document = new WordDocument () ؛ * هذا السطر من الكود ليس برمجة موجهة نحو الواجهة بالكامل ، لأن فئة محددة تظهر على الجانب الأيمن من العلامة المتساوية*/ test public void testDocument_Nospring () {document document = new WordDocument () ؛ DocumentManager DocumentManager = New DocumentManager (document) ؛ documentManager.Read () ؛ documentManager.write () ؛ } /*** على جانب الكود ، لا أعرف من يقوم بتنفيذ المستند. يتم تحديد هذا بواسطة ملف تكوين الربيع * <bean id = "documentmanager"> <!-المستند هو واجهة-> <property name = "document"> <!-WordDocument هي فئة تنفيذ ، تم تعيينها لواجهة المستند- classpathxmlapplicationContext ("ApplicationContext.xml") ؛ DocumentManager documentManager = (DocumentManager) Context.getBean ("DocumentManager") ؛ documentManager.Read () ؛ documentManager.write () ؛ }}مما سبق ، يمكننا أن نرى الفرق بين عدم تطبيق الربيع وتطبيق الربيع
<!-DocumentManager ، WordDocument ، exceldocument ، pdfdocument يتم وضعها في حاوية الربيع-> <bean id = "worddocument"> </bean> <bean id = "exceldocument"> <///bean id = "pdfdocument"> </bean id = "pdfdocument" -> <property name = "document"> <!-WordDocument هي فئة تنفيذ ، مخصصة لواجهة المستند-> <Ref Bean = "PDFDocument"/> </property> </ban>
يتطلب استخدام Spring فقط تكوين الكائن المقابل <ref bean = ""> في ApplicationContext ، دون الانتباه إلى فئات تنفيذ محددة وتنفيذ البرمجة الكاملة الموجهة للواجهة. هذا هو السبب في أن الربيع يمكن أن يتكامل مع العديد من الأدوات.
2.6 MVC struculation structions2
وصف المتطلبات
إنشاء دليل مشروع
الترميز:
1. إنشاء طبقة DAO لإنشاء واجهة persondao وتنفيذ فئة persondaoimpl
الواجهة العامة persondao {public void savePerson () ؛} الطبقة العامة persondaoimpl تنفذ persondao {Override public void savePerson () {system.out.println ("Save Person") ؛ }}2. قم بإنشاء طبقة خدمة وواجهة خدمة Personser
الواجهة العامة personservice {public void savePerson () ؛} profectserviceImpl perfects {private persondao persondao ؛ public void setpersondao (persondao persondao) {this.persondao = persondao ؛ } Override public void savePerson () {this.persondao.saveperson () ؛ }}3. إنشاء إجراء ، فئة سخص
سخص الطبقة العامة public void setpersonservice (personservice personservice) {this.personservice = personservice ؛ } public void savePerson () {this.personservice.saveperson () ؛ }}4. تكوين ApplicationContext.xml
<!-ضع الخدمة ، DAO ، فئة الإجراء في حاوية الربيع-> <bean id = "persondao"> </bean> <bean id = "personvice"> <property name = "personda"> <ref bean = "persondao"/> </pertar
5. اكتب اختبار فئة TestMVC
الفئة العامة mvctest {test public void testmvc () {applicationContext context = new ClassPathxMlAppLicationContext ("ApplicationContext.xml") ؛ سخصسمال = (سخص) سياق. getBean ("الشخص") ؛ comformaction.saveperson () ؛ // Save Person}}يوضح المثال أعلاه بوضوح البرمجة الموجهة نحو الواجهة في الربيع. تحتاج طبقة الخدمة فقط إلى استدعاء واجهة طبقة DAO ، ولكنها لا تحتاج إلى الانتباه إلى فئة التنفيذ في طبقة DAO ، ولا يحتاج الإجراء إلا إلى استدعاء واجهة الخدمة ، ولكنه لا يحتاج إلى الانتباه إلى فئة التنفيذ في الخدمة.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.