AbstractDetinguctionUrlhandlermapping Регистры обработчика через сканирование и распределяется Gethandlerinternal AbstractUrlHandlerMapping при получении запроса.
Есть 5 подклассов и один абстрактный класс.
Подобно простому инициативу, он инициализируется путем перезаписи initapplicationContext, а затем вызывая детектировщики.
DetCthandlers сканируют объект приложения через BeanFactoryUtyls, а затем зарезервируйте определение корзина для подкласса для генерации соответствующего URL в соответствии с обработчиком.
Зарегистрированный регистр -иудлер все еще предоставляется AbstractUrlHandlerMapp.
// AbstractDeTectingUrlHandLermApping/*** вызывает метод {@link #detecthandlers ()} в дополнение к*SuperClass's Initiazation.*/@@overridepublic void initapplicationContext () ThrowsContextextexception {super.initApplicationContext (); DeteCthandLers ();} Это также называется инициализацией initapplication context interceptor AbstracThandLermPation.
Главный герой появляется, детектируйте, обработчики сканирования
// AbstractDetinguctionUrlHandlerMapping/*** Зарегистрировать все обработчики, найденные в текущем приложении. Бин для*, который не может быть определен, не может быть определен, просто не считается обработчиком.* @Throws org.springframework.beans.beansexception, если обработчик не может быть зарегистрирован* @see #determineurlsforhandler (String)*//Защищенные детекторины () throwsexception {if (if (if logger.isd {logger.debug ("ищет сопоставления URL в контексте приложения:" + getApplicationContext ());} string [] beannames = (this.detecthandlersinancestorContexts? Beanfactoryutils.beannamesfortypeincludedancestors (GetApplicationContext (), объект. : getApplicationContext (). getBeanNamesfortype (object.class)); // Принять любое имя боба, которое мы можем определить URL для.for (String Beanname: Beannames) {String [] urls = degineurlsforhandler (beanname); if (! objectutils.isempty (urls)) {// Найденные пути URL: давайте рассмотрим это обработчиком. registerhandler (urls, beanname);} else {if (logger.isdebugenabled ()) {logger.debug ("dueceeded bean 'name' ' + beanname +"': no urlied urlied etme etme etme etmified); Метод шаблона, зарезервированный здесь, определяется следующим образом:
/*** Определите URL -адреса для данного бокана. Давайте посмотрим на реализацию метода шаблона в BeannameUrlhandlermapping и AbstractControllerRlhArdlermapp. BeanNameUrlhandLermapping очень прост, поэтому оно реализует DesiteurlsForHandler. Псевдоним в нем должен быть настроен в файле конфигурации через Beanname.// BeanNameUrlHandLermApping/*** проверяет имени и псевдонимы данного фасоля для URL, начиная с "/".*//@overrideProtected String [] DegineUrlsForHandler (String BeanName) {list> urls = rtls = rtrakeList <string>; if string> (string beanname) {list> urls = rtlslist <string>;); (beanname.startswith ("/")) {urls.add (beanname);} string [] aliases = getApplicationContext (). getaliases (beanname); for (string alias: aliases) {if (alias.startswith ("/")) {urls.add (псевдоним);}} return stringutils.tostringarray (urls);} Давайте посмотрим на реализацию в AbstractControllerUrlHandlerMapp
Iselibleformapping определяет, исключен ли контроллер (исключен через пакет пакета или класс класса).
Buildurlsforhandler реализует конкретные правила генерации URL -адреса из подклассов
iscontrollertype определяет, является ли подкласс контроллера
Buldurlsforhandler оставляет метод шаблонов для производственных URL -адресов подкласса.
// AbstractControllerUrlHandLermApping/*** Эта реализация делегирует в {@link #buildurlsforhandler},*предоставил {@link #iseLigibleformapping} return {@code true). getApplicationContext (). Gettype (Beanname); if (iseligibleformapping (beanname, beanclass)) {return buildurlsforhandler (beanname, beanclass);} else {return null;}} // AbstractControllerRhArdermappsing/** просто определяет, определяет ли контроллер. Контроллер Bean* @param beanclass Конечный класс контроллера Bean* @return. Независимо от того. {logger.debug ("Exclude Controller Bean '" + beanname + "' Из картирования имени класса" + ", потому что его тип бобов нельзя определить");} вернуть false;} if (this.excludclasses.contains (beanclass)) {if (logger.isdebugenabled ()) {logger.debugs)) {if (logger.isdebugenabled ()) BeanName + "'' Из картирования имени класса" + ", потому что его класс бобов явно исключен:" + beanclass.getName ());} вернуть false;} string beanclassname = beanclass.getname (); for (string packageName: this.excludpackages) {if (beanclassname.startswith (packenme) (logger.isdebugenabled ()) {logger.debug ("Exclude Controller Bean '" + beanname + "' из сопоставления имени класса" + "Потому что его класс бобов определяется в исключенном пакете:" + beanclass.getname ());} return false;} return iscontrollertype (beanclass); AbstractControllerUrlhandLermPapping/*** Определить, указывает ли данное класс бобов тип контроллера*, который поддерживается этой стратегией отображения.* @Param beanclass класс для интроспекции*/защищенного логического Iscontrollertype (класс Beanclass) {repressist.sredicate.iscontrollertype (beanclass); Подкласс контроллера или подкласс мультиатрконтроллера ./*** Внутренний вспомогательный класс, который идентифицирует типы контроллеров. ** @author Juergen Hoeller*@since ..*/class controllertypepredicate {public boolean iscontrollertype (class beanclass) {return Controller.class.IsAssignableFrum (beanclass); ismultiActionControllerType (Class Beanclass) {return MultiActionController.class.isassignablefrom (beanclass);}} Зарезервировать метод шаблона для создания URL
// AbstractControllerUrlhandLermapping/*** Метод абстрактного шаблона, который будет реализован подклассами.* @Param beanname Имя боба* @param beanclass Тип бобов* @return the urls, определяемые для бобов*/защищенная абстрактная строка [] buildurlsforhandler (String Beanname, Class Beanclass);
Давайте посмотрим на две реализации AbstractControllerUrlhArdlermapping ControllerbeanNameUrlhandLermapping и ControlerClassNameUrlHandlerMapp.
На самом деле, эти два очень просты. Один из них заключается в создании URL на основе Beanname, а другой - создавать URL на основе имени класса.
// ControllerBeanNameUrlHandLermApping@переопределенная строка [] buildurlsforhandler (String Beanname, Class Beanclass) {list <string> urls = new ArrayList <string>; urls.add (GeneratePathmapping (beanname)); String [] aliases = getApplicationContext () getAlias (beanname)); string [] aliases = getApplicationContext (). (Строка псевдоним: псевдоним) {urls.add (GeneratePathmapping (Alias));} return stringUtils.toStringArray (urls);} // controllerbeanNameUrlhArdlermapping/** Добавить '/', если требуется, и добавляет суффикс URL к названию. (beanname.startswith ("/")? Beanname: "/" + beanname); pathbuilder path = new stringbuilder (); if (! name.startswith (this.urlprefix)) {path.append (this.urlprefix);} path.append (name); if (! {path.append (this.urlsuffix);} return path.tostring ();} // controlerclassnameurlhandlermapping Непосредственно делегировать для генерации внедрения.
@OverrideProtected String [] BuildUrlsForHandler (String BeanName, Class Beanclass) {return GeneratePathmappings (beanclass);} // controlerclassnameurlhandLermappingPopping Получите префикс пути через BuildPathPrefix
Получите ClassName через Classutils, такие как BookController (без имени пакета), и используйте прокси -сервер CGLIB для решения проблемы вместе.
Преобразовать имя класса в соответствии с тем, является ли случай чувствительным (случаи по умолчанию чувствительно = false;)
IsmultiActionControllerType определяет, является ли контроллер подклассом мультиатрконтроллера, то есть независимо от того, содержит ли контроллер несколько обработчиков.
/*** Сгенерировать фактические пути URL -адреса для данного класса контроллера.* <p> Подклассы могут выбрать настройку полученных путей. buildPathPrefix (beanclass); string classname = classutils.getshortname (beanclass); string path = (classname.endswith (controller_suffix)? classname.substring (, classname.lastindexof (controller_suffix): classname); if (path.lendy ()>) {pathmapping.append (path.substring (,) .tolowercase ()). Append (path.substring ());} else {pathmapping.append (path.tolowercase ());}} if (iSmultiActionControllerType (beanclass) {return new String. "/*"};} else {return new String [] {pathmapping.tostring () + "*"};}} // controlerclassnameurlhandlermapping/*** Создание префикса пути для заданного класса контроллера. StringBuilder buildPathPrefix (Class BeanClass) {StringBuilder Pathmapping = new StringBuilder (); if (this.pathprefix! = Null) {pathmapping.append (this.pathprefix); pathmapping.append ("/");} else {pathmapping.append ("/"); {String packageName = classutils.getPackageName (beanclass); if (packageName.startswith (this.basepackage)) {String subpackage = packageName.substring (this.basepackage.length ()). Заменить ('.', '/'''' capathping.AppenddayT.CaseStority? subpackage: subpackage.toloarcecase ()); pathmapping.append ("/");}} возвращение пути;} // AbstractControllerUrlHandlerMapping Predicate.ismultiActionControllerType Реализация см. ControllerTyPepredicate выше
/*** Определите, указывает ли данный класс бобов тип контроллера*, который посылает множественные методы действия.* @Param beanclass класс для интроспекции*/защищенный логический iSmultiActionControllerType (класс Beanclass) {return this.fedicate.ismultiactontrollertype (beanclass);};};};};Выше приведено соответствующие знания об инициализации интерпретации исходного кода SpringMVC - AbstractDetinguctionUrlhandLermapping Series, которую редактор представил вам. Я надеюсь, что это будет полезно для всех!