1. ملاحظات
التعليقات التوضيحية هي آلية مماثلة للشرح. يمكن لإضافة التعليقات التوضيحية في الكود استخدام هذه المعلومات في وقت لاحق. على عكس التعليقات ، فإن التعليقات هي أن نرى. لا يمكن تجميع جهاز Java Virtual ، ولا يتم تجميع التعليقات التوضيحية ، ولكن يمكننا قراءة المعلومات في التعليقات التوضيحية من خلال آلية الانعكاس. يستخدم التعليق التوضيحي الكلمة الرئيسية interface ، وراثي java.lang.annotition.annotation
1. التعليقات التوضيحية في جافاز
اسمحوا لي أن أعطيك مثالاً لمراجعة ماهية التعليقات التوضيحية في Javase. المفتاح هو نقطتان: تعريف التعليقات التوضيحية وكيفية الحصول على المعلومات فوق التعليق التوضيحي من خلال التفكير.
1. حدد أولاً اثنين من التعليقات التوضيحية. أحدهما هو ClassInfo المشروح على الفصل ، والآخر هو MethodInfo مشروح على الطريقة.
ClassInfo
package com.itheima10.annotation ؛ import java.lang.annotation.documented ؛ import java.lang.annotation.elementtype ؛ import java.lang.annotation.retention ؛ import java.lang.annotation.retentionpolicy ؛ يمكن استخدامها في الفئة @الاحتفاظ (attreentionpolicy.runtime) // في ملفات Java ، يمكن إنشاء ملفات الفئة وشروط وقت التشغيل @Documented // في مستند تعليمات public interface classInfo { /** * هذا التعليق على خصائص نوعين من نوع السلسلة * /string name () default "" ؛ قيمة السلسلة () الافتراضي "" ؛}MethodInfo
package com.itheima10.annotation ؛ import java.lang.annotation.documented ؛ import java.lang.annotation.elementtype ؛ import java.lang.annotation.retention ؛ eSport java.lang.annotation.retentionpolicy ؛ يمكن استخدامها على الأساليب @الاحتفاظ (attreenteringpolicy.runtime) // في Java ، يمكن إنشاء ملفات الفصل والتعليقات التوضيحية للوقت // يمكن إنشاء Documented // في Delp Document public interface methodInfo { /*** هذا التعليق على خصائص نوعان من نوع السلسلة* /string name () "؛" ؛ قيمة السلسلة () الافتراضي "" ؛}2. اكتب فئة التعليق التوضيحي لاستخدام التعليق التوضيحي المحدد أعلاه
package com.itheima10.annotation ؛ classinfo (name = "xiaopingguo118" ، value = "niu") الفئة العامة annotationuse {methodinfo (name = "java" ، value = "Spring Framework is" public ") public void java () {}}}}3. اكتب اختبار التعليق التوضيحي وحوض الخصائص فوق التعليقات التوضيحية
package com.itheima10.annotation ؛ import java.lang.reflect.method ؛ import org.junit.test ؛ include includytest {public static void test () { / ** * if parse of the class ، الحصول على الفئة * إذا تم تحليل التعليق على الطريقة ، احصل على الطريقة الأولى = itheima10.class ؛ // احكم على ما إذا كان هناك تعليق من الفئة على الفصل إذا (class1.isannotationpresent (classInfo.class)) {// الحصول على التعليق على classClassInfo classInfo = (classInfo) class1.getannotation (classinfo.class) ؛ system.out.println (classInfo.value ()) ؛ System.out.println (classInfo.name ()) ؛ } method [] methods = class1.getMethods () ؛ بالنسبة إلى (الطريقة الطريقة: الأساليب) {// هل هناك تعليق توضيحي methodInfo على الطريقة التي يتم اجتيازها إذا (method.isannotationpresent (methodInfo.class)) {methodInfo methodInfo = method.getAnnotation (methodInfo.class) ؛ System.out.println (methodInfo.name ()) ؛ system.out.println (methodInfo.value ()) ؛ }}} test public void test () {anotationTest.test () ؛ }}2. التعليقات التوضيحية في الربيع
يوفر لنا إطار الربيع وظائف التعليقات التوضيحية.
إن استخدام برمجة التعليقات التوضيحية هو استبدال ملفات XML وجعل التطوير بشكل أسرع. ومع ذلك ، فإن استخدام ملفات XML هو حل مشكلة تعديل الكود المصدر للبرنامج. الآن بعد أن لا أستخدم ملفات XML ، ألا تنتهك مبدأ الفتح والإغلاق؟ هذا صحيح. ومع ذلك ، فإن التعليقات التوضيحية جيدة أيضًا ، لذلك لا تحتاج إلى تكوين العديد من ملفات XML عند استخدام التعليقات التوضيحية. أهم شيء هو أن لديهم كفاءة تطوير عالية. .
عند عدم استخدام أي تعليقات توضيحية ، يجب تكوين العديد من العلامات في ملف Configuration Application Conntext.xml من إطار عمل الربيع لإعلان كائنات الفئة. باستخدام التعليقات التوضيحية ، لا تحتاج إلى إضافة سحب العلامة في ملف التكوين ، والوصف المقابل هو إضافة تعليمات في موضع "التعليق" للفئة المقابلة. المقدمة المحددة هي كما يلي:
• 1. مزيج من العلاقات بين كائنات Resource ، الافتراضي هو التجميع بالاسم. إذا كان لا يمكن العثور على الكائن المرتبط به بناءً على الاسم ، فسيتم استمرار البحث حسب النوع. إذا لم يتم تحديد سمة اسم ،
• عندما يتم وضع علامة على التعليق التوضيحي في حقل ، فإن الافتراضي هو أخذ اسم الحقل كاسم حبة للعثور على كائن التبعية
• عندما يتم وضع علامة على التعليقات التوضيحية على طريقة Setter للسمة ، يتم اعتبار اسم السمة الافتراضي كاسم حبة للعثور على كائن التبعية.
• ملاحظة: إذا لم يتم تحديد سمة الاسم ولا يمكن العثور على كائن التبعية افتراضيًا ، فإن reresource enrodation يعود إلى التجميع حسب النوع. ولكن بمجرد تحديد سمة الاسم ، لا يمكن تجميعها إلا بالاسم.
• 2. Autowired
يتم تجميع autowired حسب النوع بشكل افتراضي ، يتم تجميع Resource بشكل افتراضي ، وفقط عندما لا يمكن العثور على الفاصوليا التي لا يمكن العثور على الاسم حسب النوع. الحل هو تجميع الكائنات المعتمدة حسب النوع. بشكل افتراضي ، يتطلب وجود كائنات تابعة. إذا تم السماح بقيم فارغة ، فيمكن ضبطها على خطأ.
• 3. QALIFIER
إذا كنا نريد استخدام التجميع بالاسم ، فيمكننا استخدامه بالاقتران مع Qualifier Eanotation.
1. لاستخدام التعليقات التوضيحية ، تحتاج إلى إضافة خطوات ملف الاسم وقيد إلى ملف التكوين:
تقديم مساحة اسم السياق
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns: xsi = "http://www.w3.org/2001/xmlschema-inostance"
xmlns: context = "http://www.springframework.org/schema/context"
...
http://www.springframework.org/schema/context/spring-context-2.5.xsd ">
2. إضافة السياق: علامة التعليق التوضيحي إلى ملف التكوين
<السياق: التعليق التوضيحي-config> </سياق: التعليق التوضيحي-config>
مثال العرض التوضيحي:
اكتب فصلًا ما مع سمة طالب وطريقة Say (). الرمز كما يلي
package com.itheima10.spring.di.annotation ؛ import javax.annotation.resource ؛ استيراد org.springframework.beans.factory.annotation.autowired اكتب @Qualifier ("الطالب") * */public class person {resource (name = "student") طالب خاص ؛ public void says () {this.student.say () ؛ }}رمز فصل الطالب كما يلي
package com.itheima10.spring.di.annotation ؛ طالب الطبقة العامة {public void say () {system.out.println ("student") ؛ }}تكوين ملف ApplicationContext.xml
<؟ Xmlns: XSI = "http://www.w3.org/2001/xmlschema-instance" http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www <!-ضع الشخص والطالب في حاوية الزنبرك-> <bean id = "person"> </bean> <bean id = "student"> </bean> <!-تقديم مساحة اسم السياق xmlns: context = "http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5
اكتب اختبار فئة الاختبار
package com.itheima10.spring.di.annotation ؛ استيراد org.junit.test ؛ استيراد org.springframework.context.applicationContex 3. عندما يتم تحليل حاوية الزنبرك إلى* <السياق: التعليق التوضيحي-config> </context: التعليقات التوضيحية-config>* ، سيتم بدء تشغيل محلل الشرح لحقن التبعية* 4. سوف تحقق ما إذا كانت قيمة سمة الاسم للشرح هي "" * إذا كانت "" ، فستطابق اسم السمة حيث يوجد التعليق التوضيحي وقيمة المعرف في حاوية الزنبرك. إذا نجحت المباراة ، فإن المهمة * إذا لم تنجح المباراة ، فسيتم تنفيذ المهمة وفقًا للنوع. إذا نجحت المباراة ، سيتم تعيين المهمة * إذا لم تنجح المباراة ، فسيتم الإبلاغ عن المهمة * إذا لم تنجح المباراة ، فسيتم الإبلاغ عن المهمة مباشرة * قارن النوع المرجعي XML والشروح. الكفاءة عالية نسبيا. الكتابة أكثر إثارة للقلق. كتابة التعليقات التوضيحية بسيطة نسبيا وأقل كفاءة */////الطبقة العامة التعليق التوضيحي {test public void testannotation () {ApplicationContext context = new ClassPathmLapplicationContext ("ApplicationContext.xml") ؛ شخص الشخص = (شخص) سياق. getBean ("شخص") ؛ person.say () ؛ }}إذا كنت تستخدم التعليقات التوضيحية ، فلن تحتاج إلى تحميل الشخص والطالب في ملف التكوين ، والذي يمكنه تبسيط كتابة ملف التكوين.
3. المسح
في الأمثلة السابقة ، استخدمنا تعريف Bean XML لتكوين المكونات. في مشروع أكبر قليلاً ، عادة ما يكون هناك مئات المكونات. إذا تم تكوين هذه المكونات باستخدام تعريف XML Bean ، فمن الواضح أنها ستزيد من حجم ملف التكوين ، مما يجعله غير مناسب جدًا للعثور عليه وصيانته. يقدم SPRING2.5 آلية مسح مكون تلقائي بالنسبة لنا ، والتي يمكن أن تجد فئات مشروحة مع @service ، controller ، و repository التعليقات التوضيحية تحت classpath ، ودمج هذه الفئات في حاوية الربيع لإدارتها. وظيفتها هي نفسها استخدام مكونات تكوين عقدة الفول في ملف XML. لاستخدام آلية المسح التلقائي ، نحتاج إلى فتح معلومات التكوين التالية:
1. قدم مساحة اسم السياق
إضافة السياق: علامة المسح المكون في ملف تكوين XML
عندما تكون الحزمة الأساسية (الحزمة الفرعية) التي يجب فحصها.
مثال:
المثال أعلاه مكتوب في وضع المسح على النحو التالي
class class class {resource (name = "student") طالب خاص الطالب ؛ public void says () {this.student.say () ؛ }}@componentpublic class student {public void say () {system.out.println ("student") ؛ }}يجب تكوين ApplicationContext.xml فقط في جملة واحدة
<!-مكون المكون يضع فئة في حاوية زنبركية ، ويسمى الفئة المسح الضوئي للمكون أسفل الحزمة وحقائب فرعية محددة بواسطة الحزمة الأساسية-> <Contex
اكتب اختبار فئة الاختبار
/*** مبدأ* 1. ابدأ حاوية الربيع* 2. حلقة حاوية الربيع* <السياق: مكون المسكي الأساسي-"com.itheima10.spring.scan"> </context: component-scan> 3. == أي ما يعادل <bean id = "person"> component ("aa") شخص فئة عامة {} == يعادل <bean id = "aa"> 5. اتبع خطوات التحليل من resource: يتم مسح العملية بأكملها مرتين ، والكفاءة هي أن تكون أقل واختبارًا للطبقة. جديد classPathxMlapplicationContext ("ApplicationContext.xml") ؛ شخص الشخص = (شخص) سياق. getBean ("شخص") ؛ person.say () ؛ }}ظهور الحالات
سنقوم بتغيير آخر نظام لإدارة المستندات في البند 51 في التعليق التوضيحي. تظل واجهة المستند دون تغيير ، مع طرق القراءة والكتابة. فئات التنفيذ هي كما يلي Exceldocument و PDFDocument و WordDocument.
component ("exceldocument") الطبقة العامة exceldocument تنفذ المستند {public void read () {system.out.println ("excel read") ؛ } public void write () {system.out.println ("excel write") ؛ }}@component ("pdfdocument") public class pdfdocument تنفذ المستند {public void read () {system.out.println ("pdf read") ؛ } public void write () {system.out.println ("pdf write") ؛ }}@component ("WordDocument") public class wordDocument تنفذ المستند {public void read () {system.out.println ("Word read") ؛ } public void write () {system.out.println ("word write") ؛ }}DocumentManager
component ("documentManager") class public class documentmanager {ersource (name = "exceldocument") وثيقة وثيقة خاصة ؛ public void read () {this.document.read () ؛ } public void write () {this.document.write () ؛ }}ملف التكوين
<السياق: مكون المسح الضوئي package = "com.itheima10.spring.iocdi.document">
</سياق: مكون المساحة>
اكتب اختبار مستند فئة الاختبار
documentTest chorsest {test public void testDocument () {applicationContext context = جديد classPathxMlapplicationContext ("ApplicationContext.xml") ؛ DocumentManager documentManager = (DocumentManager) Context.getBean ("DocumentManager") ؛ documentManager.Read () ؛ documentManager.write () ؛ }} 2. مقدمة لوظائف التعليقات التوضيحية الأخرى
يتم استخدام Service لتعليق مكونات طبقة الأعمال وشروطات طبقة الخدمة
يتم استخدام Controller لتعليق مكونات طبقة التحكم (مثل الإجراء في الدعامات) وشرح طبقة التحكم
يتم استخدام repository لتعليق مكونات الوصول إلى البيانات ، أي مكونات DAO. تعليق طبقة الثبات
يشير component إلى المكونات. عندما لا يسهل تصنيف المكونات ، يمكننا استخدام هذا التعليق التوضيحي للتعليق.
أمثلة إعادة إنتاج حالة MVC
نقوم بمراجعة حالات MVC في البند 51 مرة أخرى ، مع إضافة طبقات DAO والخدمة والعمل من Persondaoimpl و Donaction و PersonserviceImpl على التوالي لإضافة التعليقات التوضيحية إلى DAO ، وخدمة ، وطبقات عمل Persondaoimpl.
repository ("persondao") الطبقة العامة persondaoimpl تنفذ persondao {override public void savePerson () {system.out.println ("Save Person") ؛ }} @service ("personservice") Public Class PersonServiceImpl تنفذ Profonsservice {resource (name = "persondao") Private Persondao persondao ؛ public void setpersondao (persondao persondao) {this.persondao = persondao ؛ } Override public void savePerson () {this.persondao.saveperson () ؛ }} @controller ("profiction") class public classeaction {resource (name = "personservice") performerservice prophonservice ؛ public void setpersonservice (personservice personservice) {this.personservice = personservice ؛ } public void savePerson () {this.personservice.saveperson () ؛ }}اكتب اختبار mvctest
الفئة العامة mvctest {test public void testmvc () {applicationContext context = new ClassPathxMlAppLicationContext ("ApplicationContext.xml") ؛ سخصسمال = (سخص) سياق. getBean ("الشخص") ؛ commonaction.saveperson () ؛ }}4. الميراث في الربيع
يدعم الربيع الميراث ، الذي يمكن تقسيمه إلى الميراث الطبقي وميراث السمة.
1. الميراث الطبقي
خصائص الربيع:
(1) الملخص: إذا تم ضبطه على TRUE ، فهذا يعني أن الفاصوليا المحددة مجردة ، أخبر الربيع بعدم إنشاء مثيل للفاصوليا ؛
سؤال: هل يجب أن يكون فئة مجردة؟ هل يمكن أن يكون فئة مجردة؟
(2) الوالد: يشير إلى وظيفة معرف الفول على الفول ، والتي تعادل وظيفة تمتد على فئة Java ؛
المشهد: هناك ثلاثة حبوب:
<bean id = "bean1" class = "... testbean"> <property name = "sex" value = "male"/> </bean> <bean id = "bean2" class = "... testBean> <property name =" sex "
تعديل: تحديد الفول الأصل الربيعي
<bean id = "basebean" class = "... testbean"> <property name = "sex" value = "male"/> </bean>
تحديد الغابات
<bean id = "bean1" parent = "baseBean"/> يرث خصائص الفول الأصل <bean id = "bean2" parent = "baseBean"/> <bean id = "bean3" parent = "baseBean> الكتابة فوق خصائص الفاصوليا الوالد <property name =" sex "
يمكن أن ترث فاصوليا الطفل خصائص الفول الأصل أو تجاوز خصائص الفول الأصلي.
2. السمة الميراث
هناك نفس السمات بين عدة حبوب مختلفة ، ويمكن استخراج المشهد:
<bean id = "bean1" class = "... atestbean"> <property name = "sex" value = "male"/> <property name = "task" ref = "task"/> </bean> <bean id = "bean2" class = "... btestbean> <property name =" sex "
تعديل: (1) استخراج السمات العامة
<bean id = "basesex" Abstract = "true"> <property name = "sex" value = "male"/> </bean>
(2) تعديل الفول
<bean id = "bean1" class = "... atestbean" parent = "basesex"> <property name = "task" ref = "task"/> </bean> <bean id = "bean2" class = "... btestbean" parent = "basesex"/>
هنا ، لدى الفاصوليا سمات الوالدين والفئة ، ويشير Basesex الذي يشير إليه الوالد إلى الفاصوليا المختلفة بمشاركة نفس قيمة السمة ؛ عندما يعلن TransactionProxyFactoryBean الخدمة ، يمكن لميراث سمة الفول أن يقلل بشكل كبير من تكوين XML الزائد.
لا يتطلب الميراث القائم على التعليقات التوضيحية سمات الوالدين.
دعونا نمتلك صورة ملخصة صغيرة الأخيرة
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.