AbstractDetectingUrlhandLermapping سجلات من خلال المسح ، ويتم توزيعها بواسطة gethandlerinternal من التجريدية atrlhandlermapping عند تلقي الطلب.
هناك 5 فئات فرعية وفئة مجردة واحدة.
على غرار SimpleUrlhandlerMapping ، يتم تهيئته عن طريق الكتابة فوق initapplicationContext ثم استدعاء detectHandlers.
DetectHandlers مسح كائن التطبيق من خلال BeanFactoryUtils ، ثم حجز المحددات Forrandler للفئة الفرعية لإنشاء عنوان URL المقابل وفقًا للمعالج.
لا يزال يتم توفير سجل التسجيل المسجل بواسطة AbstractUrlhandlerMapping.
.
وهذا ما يسمى أيضا اعتراض تهيئة initapplicationContext من Argtracthandlermapping.
يظهر بطل الرواية ، واكتشاف المعالجات ،
. لا يُعتبر الفاصوليا لـ* التي لا يمكن تحديد عناوين URL هذه ببساطة معالجًا. {logger.debug ("البحث عن تعيينات url في سياق التطبيق:" + getApplicationContext ()) ؛} String [] Beannames = (this.detectHandlersInancestorContexts؟ beanfactoryutils.beannamesfortypeincludeDeDeDeDeDeDeDencestors (getapplicationContex : getApplicationContext (). getBeannamesfortype (object.class)) ؛ if (! objectUls.isempty (urls)) {// url مسارات موجودة: دعنا نعتبرها معالجًا. يتم تعريف طريقة القالب المخصصة هنا على النحو التالي:
/*** حدد عناوين URL الخاصة بـ Bean Handler Bean. دعنا نلقي نظرة على تنفيذ طريقة القالب في beannameurlhandlermapping و acctectControllerUrlhandlermapping. BeannameUrlhandlerMapping بسيط للغاية ، لذلك فإنه يحدد المحددات. يجب تكوين الاسم المستعار فيه في ملف التكوين من خلال beanname.// beannameurlhandlermapping/*** يتحقق من الاسم والأسماء المستعارة للفاصوليا المعينة لعنوان url ، بدءًا من "/".*/@overrideprotected string [] {urls.add (beanname) ؛} string [] aliases = getApplicationContext (). getAliases (beanname) ؛ من أجل (الاسم المستعار السلسلة: الاسم المستعار) {if (alias.startswith ("/")) {urls.add (alias) ؛}} return stringutils.toStringArray (urls) ؛} دعونا نلقي نظرة على التنفيذ في AbstractControllerUrlhandlermapping
يحدد IsEvelformpling ما إذا كان وحدة التحكم مستبعدة (مستبعدة من خلال الحزمة أو فئة الفئة).
يقوم Buildurlsforhandler بتنفيذ قواعد توليد عناوين URL محددة من الفئات الفرعية
تحدد ISControllerType ما إذا كانت الفئة الفرعية لوحدة التحكم
Buildurlsforhandler Reserves Template Method لعنوان URL لإنتاج الفئة الفرعية.
// AbstractControllerUrlhandLerMapping/*** هذا التنفيذ مندوب إلى {link #buildurlsforhandler} ،*شريطة أن {link #IseliPofforming} إرجاع {code true ).*/overrideprotected string [] getApplicationContext (). param beanclass الفئة الملموسة من وحدة تحكم Bean* @return ما إذا كانت الفئة المحددة مستبعدة* seee #setexcludedpackages* seee #setexcludedclasses*/محمية boolean isEvelforming (string beanname ، class beanclass) {if (beanclass == null) {logger.debug ("استبعاد وحدة تحكم الفول" + beanname + "من تعيين اسم الفئة" + "لأنه لا يمكن تحديد نوع الفاصوليا") ؛} إرجاع خطأ ؛} إذا (this.excludedclasses.contains (beanclass)) {if (logger.isdeBugenabled () رسم خرائط " +" لأن فئة الفول المستبعد صراحة: " + beanclass.getName ()) ؛} return false ؛ {logger.debug ("استبعاد وحدة تحكم الفول" + beanname + "من تعيين اسم الفصل" + "لأن فئة الفاصوليا الخاصة بها محددة في حزمة مستبعدة:" + beanclass.getName ()) ؛ بدعم من هذه الاستراتيجية التعيين. أنواع وحدة التحكم. ** Auuthor Juergen Hoeller* since ..*/class controllerTyPepRedicate {public boolean isControllerType (class beanclass) {return controller.class.isassignablefrom (beanclass) ؛ MultiActionController.class.isassignablefrom (beanclass) ؛}} حجز طريقة القالب لإنشاء عنوان URL
// AbstractControllerUrlerMermapping/*** طريقة القالب المجردة التي سيتم تنفيذها بواسطة الفئات الفرعية.
دعنا نلقي نظرة على اثنين من تطبيقات ControlBeannameUrlhandLermapping و ControlRlaStNameUrlhandLermapping.
في الواقع ، هذان الأمران بسيطان للغاية. أحدهما هو إنتاج عنوان URL استنادًا إلى Beanname ، والآخر هو إنتاج عنوان URL استنادًا إلى اسم className.
// ControlRebeannameUrlhandLermapping@overrideprotected string [] BuildUrlsForHandler (String Beanname ، class beanclass) {list <String> urls = new ArrayList <String> () ؛ urls.add (enderatePathmapping (beanname)) ؛ الاسم المستعار: الأسماء المستعارة) {urls.add (conderatepathmapping (alias)) ؛} return stringUtils.ToStringArray (urls) ؛} // controlbeannameurlhandlerming/** add a '/' إذا لزم الأمر ويلحق لاحقة عنوان URL بالاسم. ؟ path.toString () ؛} // controlRClassNameUrlhandLermapping تفويض مباشرة إلى تنفيذ CollatePathMappings
سلسلة OverRideProtected [] BuildurlsForHandler (سلسلة Beanname ، فئة Beanclass) {return cenderatePathMappings (beanclass) ؛} // ControlRclassNameUrlhandLermapping احصل على بادئة المسار من خلال buildpathprefix
احصل على className من خلال classutils ، مثل BookController (بدون اسم الحزمة) ، واستخدم وكيل CGLIB لحل المشكلة معًا.
تحويل اسم className وفقًا لما إذا كانت القضية حساسة (الحالات الافتراضية = خطأ ؛)
تحدد IsMultiActionControllerType ما إذا كانت وحدة التحكم هي فئة فرعية من MultiActionController ، أي ما إذا كانت وحدة التحكم تحتوي على معالجات متعددة.
/*** إنشاء مسارات URL الفعلية لفئة وحدة التحكم المعطى.* <p> قد تختار الفئات الفرعية تخصيص المسارات التي يتم إنشاؤها* عن طريق تجاوز هذه الطريقة. BuildPathPrefix (beanclass) ؛ String className = classUtils.getShortName (beanclass) ؛ string path = (className.endswith (controler_suffix)؟ className.subString (، classname.lastindexof (controler_suffix)): className) ؛ if (path.length () {pathmapping.append (path.substring (،) .tolowercase ()) "/*"} ؛} آخر {إرجاع سلسلة جديدة [] {pathmapping.toString () + "*" buildPathPrefix (class beanclass) {StringBuilder pathmapping = new StringBuilder () ؛ if (this.pathprefix! = null) {pathmapping.append (this.pathprefix) ؛ pathmapping.append ("/") ؛ classutils.getPackageName (beanclass) ؛ if (packagename.startswith (this.basePackage)) {String subpackage = packagename.substring (this.basepackage.length ()). subackage: subpackage.tolowercase ()) ؛ pathmapping.append ("/") ؛} prose.ismultiactionControllerType تنفيذ محدد
/*** حدد ما إذا كانت فئة الفول المعينة تشير إلى نوع وحدة تحكم* يرسل إلى طرق عمل متعددة.
ما ورد أعلاه هو المعرفة ذات الصلة حول تهيئة SPRINGMVC تفسير رمز مصدر المعالجة - التجريدة DetectingUrlhandlermapping التي قدمها لك المحرر. آمل أن يكون ذلك مفيدًا للجميع!