يمكن تقسيم التعليقات التوضيحية في الربيع تقريبًا إلى فئتين:
1) التعليقات التوضيحية المتعلقة بحاويات فول الربيع ، أو مصانع الفول ؛
2) التعليقات التوضيحية المتعلقة بـ SpringMVC.
تشمل التعليقات التوضيحية المتعلقة بحاوية Bean SPRING: required ، @autowired ، postconstruct ، predestory ، والشروح في JSR-330 القياسية javax.inject.
تشمل التعليقات التوضيحية ذات الصلة springmvc: controller ، requestmapping ، requestparam ، @responsebody ، إلخ.
لفهم التعليقات التوضيحية في الربيع ، يجب أولاً فهم التعليقات التوضيحية في جافا.
1. التعليقات التوضيحية في جافا
بدأت التعليقات التوضيحية في جافا 1.5. يجب أن يكون الشخص الأكثر دراية به: Override ، والذي يتم تعريفه على النحو التالي:
/** * يشير إلى أن إعلان الطريقة يهدف إلى تجاوز إعلان الطريقة في SuperType. إذا تم شرح طريقة مع * مطلوب من مجمعي نوع التعليق التوضيحي لإنشاء رسالة خطأ * ما لم يكن أحد الشروط التالية على الأقل: * تتجاوز الطريقة أو تنفيذ طريقة تم إعلانها في A * supertype. * الطريقة لها توقيع يتزايد مع التكافؤ مع * أي طريقة عامة معلنة في الكائن. * * Author Peter von der ahé * Author Joshua bloch * jls 9.6.1.4 Override * since 1.5 */ @target (elementType.Method) retente
من التعليق التوضيحي ، يمكننا أن نرى أن وظيفة Override هي مطالبة المترجم بأن الطريقة المستخدمة من قبل Override يجب أن تتجاوز الفئة الأصل أو طريقة تحمل نفس الاسم في java.lang.object. نرى أن @target و @يتم استخدامه في تعريف Override. إنهم ما يسمى بـ "meta-annotations"-فهي التعليقات التوضيحية التي تحدد التعليقات التوضيحية ، أو التعليقات التوضيحية التي تعلق على التعليقات التوضيحية (بالدوار ...). دعونا نلقي نظرة على الاحتفاظ
/** * يشير إلى المدة التي يتم الاحتفاظ بالتعليقات التوضيحية مع النوع المشروح. إذا لم يكن هناك تعليق توضيحي للاحتفاظ على * إعلان نوع التعليقات التوضيحية ، فإن سياسة الاستبقاء تتخلف عن سداد * attreencepolicy.class. * /@موثقة@الاستبقاء (attreencepolicy.runtime) target (elementType.annotation_type) public interface keking { /*** إرجاع سياسة الاستبقاء. * @رعي سياسة الاستبقاء */ entrentionpolicy value () ؛}يتم استخدام إعادة النظر في المطالبة بالمدة التي يتم الاحتفاظ بالتعليقات التوضيحية. هناك ثلاث قيم:
يجب الكشف عن التعليقات العامة attreencepolicy { /*** التعليقات التوضيحية من قبل المترجم. * / المصدر ، / ** * يجب تسجيل التعليقات التوضيحية في ملف الفصل بواسطة برنامج التحويل البرمجي * ولكن لا يلزم الاحتفاظ به بواسطة VM في وقت التشغيل. هذا هو السلوك الافتراضي *. * / class ، / ** * يجب تسجيل التعليقات التوضيحية في ملف الفصل بواسطة برنامج التحويل البرمجي والاحتفاظ به بواسطة VM في وقت التشغيل ، بحيث يمكن قراءتها بشكل عكسي. * * see java.lang.reflect.annotatedelement */ rechtime} يتم الاحتفاظ بالاحتفاظ بخلفي. يتم الاحتفاظ بالاحتفاظ بخلفي.
attreencepolicy.runtime محجوز حتى وقت التشغيل ويمكن قراءته عن طريق التفكير.
انظر إلى @target:
حزمة java.lang.annotation ؛/*** تشير إلى السياقات التي ينطبق فيها نوع التعليقات التوضيحية. يتم تحديد سياقات * الإعلان والسياقات النوع التي قد يكون فيها نوع التعليق التوضيحي * قابلة للتطبيق في JLS 9.6.4.1 ، ويشار إليها في رمز المصدر بواسطة enum * ثوابت java.lang.annotation.ElementType * @since */@موثقة@الاستبقاء (attreencepolicy.runtime) target (elementType.annotation_type) الهدف public@interface {/** * إرجاع مجموعة من أنواع العناصر التي يمكن تطبيق نوع التعليق *. * @إعادة صفيف من أنواع العناصر التي يمكن تطبيق نوع شرح * على */elementType [] value () ؛}يتم استخدام @target للمطالبة باستخدام هذا التعليق التوضيحي ، والقيم هي:
elementType elementType العام { /** ، واجهة (بما في ذلك نوع التعليق التوضيحي) ، أو إعلان التعداد* /type ، /** إعلان الحقل (يتضمن ثوابت التعداد)* /الحقل ، /** إعلان الطريقة* /الطريقة ، /** إعلان المعلمة الرسمي* /المعلمة ، /** إعلان بنيع* /بنية ، /** محلية. إعلان */ incenotation_type ،/ ** إعلان الحزمة */ الحزمة ،/ ** * اكتب إعلان المعلمة * since 1.8 */ type_parameter ،/ ** * استخدام نوع * since 1.8 */ type_use}يشير إلى المكان الذي يمكن استخدام هذا التعليق التوضيحي بشكل منفصل: 1) الفصل ، واجهة ، التعليق ، التعداد ؛ 2) مجال السمة. 3) الطريقة ؛ 4) المعلمات ؛ 5) مُنشئ ؛ 6) المتغيرات المحلية ؛ 7) نوع التعليقات التوضيحية ؛ 8) الحزمة
لذا:
target (elementType.method) @repinention (attreentering.source) public interface override {}وهذا يعني أنه لا يمكن استخدام Override إلا على الطرق ، والاحتفاظ بها على مستوى الكود المصدر ، ومعالجتها بواسطة المترجم ، ثم يتم التخلص منها.
هناك أيضًا توثيق التعليق التوضيحي المستخدم بشكل متكرر:
/** * يشير إلى أن التعليقات التوضيحية مع نوع يجب توثيقها بواسطة Javadoc * وأدوات مماثلة بشكل افتراضي. يجب استخدام هذا النوع لشرح إعلانات * الأنواع التي تؤثر شرح التعليقات التوضيحية على استخدام عناصر * المشروحة من قبل عملائها. إذا تم تعليق إعلان النوع مع * موثق ، فإن شرحه تصبح جزءًا من API العامة * للعناصر المشروحة. */@موثقة@الاستبقاء (attreentionpolicy.runtime) target (elementType.annotation_type) public interface موثقة {}يشير إلى ما إذا كان يمكن معالجة التعليقات التوضيحية بواسطة Javadoc والاحتفاظ بها في المستند.
2. تخصيص ومعالجة التعليقات التوضيحية المخصصة مع التعليقات التوضيحية
مع التعليقات التوضيحية الفوقية ، يمكنني استخدامه لتخصيص التعليقات التوضيحية التي نحتاجها. يعد الجمع بين التعليقات التوضيحية المخصصة و AOP أو المرشحات سلاحًا قويًا للغاية. على سبيل المثال ، يمكن استخدام التعليقات التوضيحية لتحقيق التحكم الدقيق في الأذونات - استخدم تعليقات الإذن على الفصول أو الأساليب ، ثم اعتراضها في AOP أو المرشحات. فيما يلي تطبيق شرح حول أذونات تسجيل الدخول:
/*** لا مطلوب تعليق مراقبة تسجيل الدخول*/@Target ({elementType.method ، elementType.type})@keening(retentionpolicy.runtime)@documentedpublic interface nologin {}لقد قمنا بتوضيح @nologin ، والتي يمكن استخدامها على الأساليب والفئات. يتم الاحتفاظ بالشرح حتى وقت التشغيل ويمكن قراءته عن طريق التفكير. معنى هذا التعليق التوضيحي هو: يمكن الوصول إلى الفئة أو الطريقة التي يتمتع بها @nologin حتى لو لم يتم تسجيل الدخول إلى المستخدم. فيما يلي عملية التعليق التوضيحي:
/*** تحقق من اعتراض تسجيل الدخول* إذا لم تكن بحاجة إلى التحقق من تسجيل الدخول ، يمكنك إضافة nologin إلى الطريقة أو وحدة التحكم*/checkloginInterceptor العامة تنفذ المعالج {private static final logger = logger.getlogger (checkloginceptor.class) ؛ معالج) يلقي الاستثناء {if (! (handler extlemof handlermethod)) {logger.warn ("معالج العملية الحالي ليس HandlerMethod =" + handler.getClass (). getName () + "، req =" + request.getquerString ()) HandlerMethod.getMethod (). getName () ؛ // تحديد ما إذا كنت بحاجة إلى التحقق من تسجيل الدخول nologin = handlermethod.getMethod (). getAnnotation (nologin.class) ؛ if (null! = nologin) {if (logger.isdebugenabled ()) {logger.debug ("التشغيل الحالي methodName =" + methodname + "لا حاجة للتحقق من تسجيل الدخول") ؛ if (null! = nologin) {if (logger.isdebugenabled ()) {logger.debug ("التشغيل الحالي methodName =" + methodname + "لا حاجة للتحقق من تسجيل الدخول") ؛ "لم يتم تسجيل الدخول إلى المستخدم ، ip =" + request.getRemoteaddr ()) ؛ reponse.getWriter (). الكتابة (jsonconvertor.convertfailresult (errorcodeenum.not_login) .ToString ()) ؛ معالج ، ModelandView ModelandView) يلقي استثناء {} Override public void eftercompletion (طلب httpservletrequest ، استجابة httpservletresponsأعلاه نحدد اعتراض تسجيل الدخول ، أولاً باستخدام الانعكاس لتحديد ما إذا تم شرح الطريقة بواسطة Nologin:
nologin nologin = handlermethod.getMethod (). getAnnotation (nologin.class) ؛
ثم حدد ما إذا تم شرح الفصل الدراسي بواسطة Nologin:
nologin = handlermethod.getMethod (). getDeclaringclass (). getAnnotation (nologin.class) ؛
إذا تم شرحه ، فإنه يعود صحيحًا. إذا لم يتم شرحه ، فسيتم تحديد ما إذا كان قد تم تسجيل الدخول إليه. إذا لم يتم تسجيل الدخول ، فإنه يعيد رسائل الخطأ إلى المقدمة والخطأ. هذا مثال بسيط على استخدام التعليقات التوضيحية والمرشحات لمعالجة الإذن. إذا توسعنا ، فيمكننا استخدام التعليقات التوضيحية للإشارة إلى أنه لا يمكن الوصول إلى طريقة أو فئة معينة إلا من قبل المستخدمين بدور أو أذونات معينة ، ثم الحكم في المرشح.
3. التعليقات التوضيحية المتعلقة بحاوية الفول الربيع
1) @autowired هو التعليق التوضيحي الذي نستخدمه أكثر. في الواقع ، AUTOWIRE = BYTYPE هو تبعية للحقن التلقائي استنادًا إلى النوع (حقن التبعية المستندة إلى التعليقات التوضيحية) ، والتي يمكن استخدامها في المجال والطريقة والمُنشئ.
2) QALIFIER هو utoWire = byname. عندما يحدد التعليق التوضيحي Autowired أن أنواع الفاصوليا المتعددة هي نفسها ، تحتاج إلى استخدام QAlifier ("xxbean") لتحديد معرف الفول التابع:
@controller @requestMapping ("/user") الفئة العامة HelloconTroller {AutOwired QAlifier ("uservervice") من القطاع الخاص userService ؛3) ينتمي Resource إلى معيار JSR250 ويستخدم في المجال والأساليب. وهو أيضًا حقن تبعية لنوع الاسم البيني. طريقة الاستخدام: Resource (name = "xxbean"). Resource بدون معلمات اسم فئة القيمة الافتراضية له أحرف صغيرة.
4) التعليقات التوضيحية في JSR-330 القياسية javax.inject.* (inject ، named ، Qalifier ، provider ، scope ، singleton). @inject يعادل autowired ، @named يعادل QAlifier ، ويستخدم named أيضًا في الفصل باسم component.
5) component ، controller ، service ، repository ، هذه التعليقات التوضيحية تختلف عن التعليقات التوضيحية أعلاه. يتم حقن التعليقات التوضيحية أعلاه في الفاصوليا المعتمدة ، ووظيفة هذه التعليقات التوضيحية هي إنتاج الفاصوليا. يتم شرح هذه التعليقات التوضيحية على الفصل ، مما يشرح الفصل في الفاصوليا واحدا تلو الآخر في مصنع الربيع بين. Controller ، service ، repository هو أساسا component مع دلالات أكثر دقة.
6) لا يتم استخدام postconstruct و predestroy لحقن التبعية ، ولكن لدورة حياة الفول. على غرار Method-Method (PiticizingBean) Method (DiscipableBean)
4. معالجة التعليقات التوضيحية في الربيع
تتم معالجة التعليقات التوضيحية في الربيع بشكل أساسي عن طريق تنفيذ واجهة BeanPostProcessor:
الواجهة العامة beanpostprocessor {object postprocessbeforeInitialization (كائن فول ، سلسلة beanname) يلقي beansexception ؛ الكائن postprocessAfterInitialization (كائن فول ، سلسلة beanname) يلقي beansexception ؛}فصول المعالجة ذات الصلة هي: AutoWireDannotationBeanPostProcessor ، CommonannotationBeanPostProcessor ، PersistennnotationBeanPostProcess
يمكن تكوين فئات المعالجة هذه ضمنيًا في حاوية الربيع من خلال <السياق: التعليق التوضيحي/>. هذه كلها هي معالجة حقن التبعية ، وكذلك معالجة تعليقات الفاصوليا الإنتاج (component ، controller ، service ، repository):
<السياق: مكون المسح الضوئي package = "net.aazj.service ، net.aazj.aop" />
يتم ذلك عن طريق تحديد مسار الحزمة الأساسية الممسوحة ضوئيًا ، ومسحها ضوئيًا في حاويات فول الربيع. لاحظ أن السياق: سيقوم المسح الضوئي بالمكون أيضًا بتكوين AutoWireDannotationBeanPostProcessor و CommonAnnotationBeanPostProcessor بشكل افتراضي. لذلك <السياق: يمكن حذف التعليق التوضيحي/>. بالإضافة إلى ذلك ، يمكن للسياق: يمكن أن يقوم المسح الضوئي بالمسح أيضًا مسح التعليق التوضيحي AOP النمط ASPECT ، ولكن من الضروري إضافة <aOP: SideJ-Autoproxy/> إلى ملف التكوين للتعاون.
5. الفرق بين التعليقات التوضيحية الربيع والشروح القياسية JSR-330:
لخص
ما سبق هو كل شيء عن فهم بسرعة التعليقات التوضيحية المختلفة في الربيع. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!