AbstractDetectingUrlhandlermapping ลงทะเบียน Handler ผ่านการสแกนและแจกจ่ายโดย Gethandlerinternal ของ Abstracturlhandlermapping เมื่อได้รับคำขอ
มีคลาสย่อย 5 คลาสและหนึ่งคลาสนามธรรม
เช่นเดียวกับ SimpleUrlhandlermapping มันจะเริ่มต้นโดยการเขียนทับ INITApplicationContext จากนั้นเรียก detecthandlers
Detecthandlers สแกนวัตถุแอปพลิเคชันผ่าน beanfactoryutils จากนั้นสำรอง encurlsforhandler สำหรับคลาสย่อยเพื่อสร้าง URL ที่สอดคล้องกันตามตัวจัดการ
registerhandler ที่ลงทะเบียนยังคงจัดทำโดย Abstracturlhandlermapping
// AbstractDetectingUrlHandLermapping/*** เรียกใช้เมธอด {@link #DetEcthandlers ()} นอกเหนือจากการเริ่มต้นของ*superclass สิ่งนี้เรียกอีกอย่างว่า initapplicationContext initceptor ของ abstracthandlermapping
ตัวเอกปรากฏตัว, detecthandlers, scan handlers
// AbstractDetectingUrlHandLermapping/*** ลงทะเบียนตัวจัดการทั้งหมดที่พบใน ApplicationContext ปัจจุบัน* <p> การกำหนด URL ที่แท้จริงสำหรับตัวจัดการนั้นขึ้นอยู่กับคอนกรีต* {@link #DeterMineUrlSforHandler (String)} การใช้งาน ถั่วสำหรับ* ซึ่งไม่สามารถกำหนด URL ดังกล่าวได้นั้นไม่ถือว่าเป็นตัวจัดการ* @throws org.springframework.beans.beansexception ถ้าตัวจัดการไม่สามารถลงทะเบียนได้* @See #DeterMineurlSforHandler {logger.debug ("มองหาการแมป URL ในบริบทแอปพลิเคชัน:" + getApplicationContext ());} สตริง [] beannames = (this.detecthandlersinancestorContexts? : getApplicationContext (). getBeanNamesFortype (object.class)); // ใช้ชื่อถั่วใด ๆ ที่เราสามารถกำหนด URL สำหรับ (สตริงถั่ว: ชื่อ BeanNames) {string [] urls = deCurlsforhandler (Beanname); if (! objectutils.isempty (urls)) {// เส้นทาง URL พบ: ลองพิจารณาว่าเป็นตัวจัดการ registerhandler (urls, beanname);} else {ถ้า (logger.isdebugenabled () {logger.debug ( วิธีเทมเพลตที่สงวนไว้ที่นี่มีการกำหนดดังนี้:
/*** กำหนด URL สำหรับ Handler Bean ที่กำหนด* @param Beanname ชื่อของถั่วผู้สมัคร* @return URL ที่กำหนดไว้สำหรับถั่ว* หรือ {@code null} หรืออาร์เรย์ที่ว่างเปล่า ลองมาดูการใช้วิธีเทมเพลตในการทำ beannameurlhandlermapping และ AbstractControllerurlhandlermapping beannameurlhandlermapping นั้นง่ายมากดังนั้นจึงใช้กำหนดการกำหนดค่าใช้จ่าย นามแฝงในนั้นควรได้รับการกำหนดค่าในไฟล์กำหนดค่าผ่าน Beanname.// beannameurlhandlermapping/*** ตรวจสอบชื่อและนามแฝงของถั่วที่กำหนดสำหรับ url เริ่มต้นด้วย "/".*/@overrideprotected String [] array <array) (beanname.startswith ("/")) {urls.add (Beanname);} string [] aliases = getApplicationContext (). getaliases (Beanname); สำหรับ (สตริงนามแฝง: นามแฝง) {ถ้า (alias.startswith ("/")) {urls.add (นามแฝง);}} return stringutils.tostringarray (urls);} ลองมาดูการใช้งานใน AbstractControllerUrlHandLermapping
isElinesidenceFormapping กำหนดว่าตัวควบคุมนั้นไม่รวมอยู่ (ไม่รวมผ่านแพ็คเกจแพ็คเกจหรือคลาส)
Buildurlsforhandler ใช้กฎการสร้าง URL ที่เฉพาะเจาะจงจากคลาสย่อย
ISControllerType กำหนดว่าคลาสย่อยของคอนโทรลเลอร์
Buildurlsforhandler Reserves Method Method สำหรับ URL การผลิต subclass
// AbstractControllerUrlHandlerMapping/*** การใช้งานนี้มอบหมายให้ {@link #buildurlsforhandler},*ระบุว่า {@link #IselIbleFormapping} ส่งคืน {@code true}.*/@overrideprotected String [] getApplicationContext (). getType (beanname); ถ้า (iselivebleformapping (beanname, beanclass)) {return buildurlsforhandler (beanname, beanclass);} else {return null; Controller Bean* @param Beanclass คลาสคอนกรีตของ Bean Controller* @return ไม่ว่าจะเป็นคลาสที่ระบุหรือไม่* @See #setExCludedPackages* @See #setExCludedClasses*/boolean ที่ได้รับการป้องกัน {logger.debug ("ยกเว้นตัวควบคุมถั่ว '" + Beanname + "' จากการแมปชื่อคลาส" + "เพราะประเภทถั่วไม่สามารถกำหนดได้");} return false;} ถ้า (this.excludedclasses.contains (beanclass)) {ถ้า (logger.isdebugenabled beanname + "'จากการทำแผนที่ชื่อคลาส" + "เพราะคลาสถั่วของมันถูกแยกออกอย่างชัดเจน:" + beanclass.getName ());} return false;} สตริง beanclassname = beanclass.getName (); (logger.isdebugenabled ()) {logger.debug ("ยกเว้นตัวควบคุมถั่ว '" + beanname + "' จากการทำแผนที่ชื่อคลาส" + "เพราะคลาสถั่วของมันถูกกำหนดไว้ในแพ็คเกจที่ยกเว้น:" beanclass.getName ()); AbstractControllerUrlHandlermapping/*** พิจารณาว่าคลาสถั่วที่กำหนดระบุประเภทคอนโทรลเลอร์* ที่ได้รับการสนับสนุนโดยกลยุทธ์การทำแผนที่นี้* @param Beanclass คลาสเพื่อ Introspect*/boolean protected iScontrollertype (beanclass) มันเป็นคลาสย่อยของคอนโทรลเลอร์หรือคลาสย่อยของ MultiactionController./*** คลาสผู้ช่วยภายในที่ระบุประเภทคอนโทรลเลอร์ ** @author Juergen Hoeller*@since ..*/class controllertypepredicate isMultiactionControllerType (คลาส BeanClass) {ส่งคืน MultiactionController.class.isassignableFrom (BeanClass);}} จองวิธีเทมเพลตเพื่อสร้าง URL
// AbstractControllerUrlHandlermapping/*** วิธีการแบบบทคัดย่อที่จะนำไปใช้โดย subclasses* @param Beanname ชื่อของถั่ว* @param Beanclass ประเภทของถั่ว* @return urls ที่กำหนดสำหรับถั่ว*/การป้องกันบทคัดย่อสตริง
ลองมาดูการใช้งานสองอย่างของ AbstractControllerUrlHandLerMapping ControllerBeanNameUrlHandlerMapping และ ControlleClassNameUrlHandlerMapping
ในความเป็นจริงสองนี้ง่ายมาก หนึ่งคือการผลิต URL ตามชื่อถั่วและอื่น ๆ คือการผลิต URL ตามชื่อคลาส
// controllerBeanNameUrlHandlermapping@verrideprotected String [] buildurlsforhandler (สตริง Beanname, คลาส beanclass) {list <string> urls = new ArrayList <String> (); urls.add (generatePathMapping (beanname) (นามแฝงสตริง: นามแฝง) {urls.add (generatePathmapping (นามแฝง));} return stringutils.toStringArray (urls);} // controllerBeannameurlhandlermapping/** เพิ่ม '/' หากจำเป็น (beanname.startswith ("/")? beanname: "/" + beanname); path StringBuilder = new StringBuilder (); ถ้า (! name.startswith (this.urlprefix)) {path.append (this.urlprefix); {path.append (this.urlsuffix);} return path.toString ();} // controlerClassNameurlhandlermapping มอบหมายโดยตรงเพื่อสร้างการใช้งาน
@OverrideProtected String [] buildurlsforhandler (สตริง Beanname, คลาส BeanClass) {return generatePathMappings (beanclass);} // controlerClassNameUrlhandlermapping รับคำนำหน้าของเส้นทางผ่าน buildpathprefix
รับ classname ผ่าน classutils เช่น BookController (ไม่มีชื่อแพ็คเกจ) และใช้ CGLIB Proxy เพื่อแก้ปัญหาร่วมกัน
แปลงชื่อ classname ตามว่ากรณีนี้มีความละเอียดอ่อน (caseensitive เริ่มต้น = false;)
IsmultiactionControllerType กำหนดว่าคอนโทรลเลอร์เป็นคลาสย่อยของ MultiactionController นั่นคือไม่ว่าคอนโทรลเลอร์จะมีตัวจัดการหลายตัวหรือไม่
/*** สร้างเส้นทาง URL ที่แท้จริงสำหรับคลาสคอนโทรลเลอร์ที่กำหนด* <p> subclasses อาจเลือกที่จะปรับแต่งเส้นทางที่สร้างขึ้น* โดยการเอาชนะวิธีนี้* @param beanclass คลาสคอนโทรลเลอร์ถั่วเพื่อสร้างการทำแผนที่ buildPathPrefix (beanclass); String className = classUtils.getShortName (BeanClass); String Path = (className.endswith (Controller_suffix)? classname.substring (, classname.Alastindexof (controller_suffix)): className); {pathmapping.append (path.substring (,) .toLowerCase ()). ผนวก (path.substring ());} else {pathmapping.append (path.toLowerCase ());}} ถ้า (ismultiactionControllerType (beanclass) pathmapping.toString () + "/*"};} else {ส่งคืนสตริงใหม่ [] {pathmapping.toString () + "*"};}} // controlerClassNameUrlhandlermapping/*** สร้างพรีทเตอร์ รวมถึงชื่อแพ็คเกจเป็นองค์ประกอบพา ธ*/Private StringBuilder BuildPathPrefix (คลาส BeanClass) {StringBuilder pathmapping = new StringBuilder (); ถ้า (this.pathprefix! = null) {pathmapping.Append (this.basepackage! = null) {String packagename = classutils.getPackagename (beanclass); ถ้า (packagename.startswith (this.basepackage)) {สตริง subpackage = packagename.substring (this.basepackage.length () Subpackage: subpackage.toLowerCase ()); pathmapping.append ("/");}} ส่งคืน pathmapping;} // บทคัดย่อ Predicate.ismultiactionControllerType การใช้งานเฉพาะดู ControllerTypepredicate ด้านบน
/*** ตรวจสอบว่าคลาสถั่วที่กำหนดระบุประเภทคอนโทรลเลอร์* ที่ส่งไปยังวิธีการกระทำหลายอย่าง* @param Beanclass คลาสไปยัง Introspect*/Boolean Protected IsmultiactionControllerType (คลาส BeanClass) {ส่งคืนสิ่งนี้ข้างต้นคือความรู้ที่เกี่ยวข้องเกี่ยวกับการเริ่มต้นของการตีความซอร์สโค้ด SpringMVC ของการตีความ handlermapping - AbstractDetectingURLHandLermapping ซีรีส์ที่บรรณาธิการแนะนำให้คุณรู้จัก ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน!