Обзор
Для веб -разработчиков модель MVC очень знакома всем. В Springmvc запрос, который соответствует условиям, вступает в диспетчер, ответственный за распространение запроса. DispatcherServlet отображает URL -адрес запроса на контроллер (сохранение при ручной работе). Руководство, наконец, возвращает HandleRexecutionChain, который содержит конкретный обработчик объектов обработки (то есть то, что мы написали, когда программируем его). Контроллер) и серия перехватчиков. В настоящее время DispatcherServlet найдет обработчик, который поддерживает этот тип процессора на основе обработчика в обработке в возвращенном HandlerexecutionChain. В адаптере процессора он в конечном итоге вызовет метод ответа на запрос контроллера и вернет представление результата (ModelandView). После получения представления результата результат отображается с помощью метода рендеринга.
Система наследования рук:
SpringMVC запросит распределение в процессор обработчика. Этот шаг решается через модуль ручной работы. Ручная рука также обрабатывает перехватчики.
Давайте посмотрим на дерево наследования сначала
Вы можете примерно классифицировать как это:
1. Интерфейс ручной работы, определите API: HandleRexeCutionChain Gethandler (httpservlectrequest), бросает исключение;
2. Основной абстрактный класс: в основном готовит контекстную среду, обеспечивает гетандлеротернальный крюк, инкапсулирует перехватчик в HandleRexecutionChain
3. Использование @controller, @requestmapping на основе аннотации
4. Настройте простое разложение с URL -адресом в файл конфигурации в файле конфигурации
5. Beannameurlhandlermapping реализуется по умолчанию
6. Картирование подклассов контроллера
Давайте посмотрим на ручной работы, просто API Gethandler очень прост.
// handlermpappackage org.springframework.web.servlet; публичный интерфейс handlermapping {handlerexecutionchain gethandler (httpservletrequest) бросает исключение;} Абстрактандлерапия не так просто
Сначала посмотрите на класс, унаследованный от абстрактного обозначения и реализации интерфейса
Пакет org.springframework.web.servlet.handler; открытый абстрактный класс AbstracThandLermPation Extends WebApplicationObjectSupportImploms Handlermapp, упорядочен {// ...} WebApplicationObjectSupport используется для предоставления Context ApplicationContext и ServletContext.
Здесь также существует метод initapplicationContext, который часто используется в будущем. AbstracThandLermPation напрямую переопределено.
Интерфейсы ApplicationContextAware и ServletContextAware по -прежнему реализованы в родительском классе, а концепция Spring очень объединена.
Заказано для сортировки сбора.
Давайте продолжим смотреть на свойства абстрактно -оборудования
// AbstracThandLermPation // Заказ назначает максимальное значение, а приоритет - наименьший частное int order = integer.max_value; // по умолчанию: так же, как и неопозитный // обработчик по умолчанию, OBEJCT, используемый здесь и внедрение подкласса, используйте ручной класс, HandleRexecutionChain и другие частные объекты Delaulthandler; // Вспомогательный класс для расчета URL Private UrlPathhelper urlpathhelper = newrlPathhelper () Patherphare Patherper Patherper Patherph = new AntPathMatcher (); // Конфигурация Interceptor:, настройка свойства HandLermPation;, extendInterceptors установить частный окончательный список <object> Interceptors = new ArrayList <Object> (); // packse из Interceptors и добавьте его непосредственно во все гистограммы Если матч будет проходить, будет использоваться частный окончательный список <MapchedInterceptor> MapedInterceptors = new ArrayList <MapedInterceptor> ();
Проверьте инициализацию перехватчика:
// AbstracThandLermapping@переопределить защищенную void initapplicationContext () Throws Beansexception {extendInterceptors (this.interceptors); DeTectMapedInterceptors (this.MappedInterceptors); initInterceptors ();}/*** предоставленные для перехватчиков субкласса, но, к сожалению, ни один из них не используется*/Proteceed Internetors (vidence excterors (3). {}/*** Сканирование сопоставленных Interceptors в приложении и добавьте их в сопоставление Interceptors*/Protected void decectmedInterceptors (list <mapedInterceptor> mappenInterceptors) {mapedInterceptors.Addall (beanfactorytoritls.beansoftypeincludedancestors (getApplicationContextector. false). Values ());}/*** Соберите сопоставление MATEDINTERCEPTOR и адаптируйте к HandlerInterceptor и WebRequestInterceptor*/Protected void initinterceptors () {if (! this.interceptors.isempty ()) {for (int i =; i <this.interceptors.size (); i ++) {объект interceptor = это. null) {throw new allogalargumentException ("nectry number" + i + "в массиве Interceptors is nul AdaptInterterceptor (объект Interceptor) {if (exatence instanceOf handlerInterceptor) {return (handlerInterceptor) Interceptor;} else if (Interceptor exantef webRequestInterceptor) {return new webRequestHandler - Interceptor.getClass (). getName ());}}Затем существует реализация Gethandler (запрос httpservlectrequest), а также оставляет за собой Gethandlerinternal (httpservletrequest) для реализации подкласса.
// AbstracThandLermAppanppublic Final HandlerexeCutionChain Gethandler (запрос httpservletrequest) throws exection {object handler = gethandlerinternal (запрос); if (handler == null) {handler = getDefaulthandler ();} if (handler = null) {return null;}/ bean wome или ressler или randler? String) {string handlername = (string) handler; handler = getApplicationContext (). GetBean (handlername);} return gethandlerexecutionChain (Handler, запрос);} защищенный абстрактный объект gethandlerinternal (httpservlectrequest запрос) throhs исключение; Наконец, инкапсулируйте перехватчик в handlerexecutionchain
Добавьте адаптированные рецепторы напрямую
Сопоставленные инчевные рецепторы должны быть добавлены после сопоставления в соответствии с URL -адресом
// AbstracThandLermPationProtected HandlerexeCutionChain gethandlerexecutionChain (обработчик объекта, httpservletrequest) {handlerexecutionchain chain = (handler ancessionof handlerexecutionchain) Хэндлер: new handlerexecutionchain (Handler); chain.addinterceptors (getAdaptedInterceptors ()); string lookuppath = urlpathhelper.getlookuppathforrequest (запрос); для (mapedinterceptor mapedinterceptor: mapedinterceptors) {if (mapedinterceptor.matches (lookuppath, pathmatcher)) {chain.addinterceptor (mapedInterceptor.getInterceptor ());}} return heach;} Картирование подклассов контроллера, эта ветвь сначала смотрит на наследство класса
Давайте поговорим о основных обязанностях каждой категории здесь
1. AbstracThandLermPation Подготовка контекстной среды; обеспечить Gethandlerinternal Hook; инкапсулировать перехватчик в handlerexecutionchain
2. AbstractUrlHandLermapping реализует метод регистрации обработчика для использования подкласса; реализует Gethandlerinternal и находит обработчик на основе информации о конфигурации, инициализированной подклассами.
3.
4. AbstractControllerUrlHandLermapping Reculsments Recainting DegineUrlsForHandler, добавляет операцию обработчика (конфигурация файла конфигурации) и оставляет за собой метод Hook BuildUrlsForHandler для реализации подкласса; В то же время судит подкласс контроллера
5. ControllerbeanNameHandlerMapping Generate URL -адрес на основе названия бобов
ControlerClassNameHandLermApping генерирует URL -адрес на основе имени класса
Давайте начнем с AbstractUrlHandlerMapp. Здесь мы просто посмотрим на код грубо. Если вам нужно тщательно проанализировать его, перейдите к <SpringMVC Spurnation - Handlermapping - AbstractUrlHandlerMapping Series Distribution>
Регистрация обработчика
Protected void Registerhandler (String [] urlPaths, String Beanname) бросает Beansexception, allodalStateException {} Protected void Registerhandler (String urlpath, обработчик объекта) бросает Beansexception, allodalStateException {} Поиск обработчика
Защищенный объект gethandlerinternal (httpservlectrequest) бросает исключение {} // Найти HandlerProtected Object LookingHandler (string urlpath, httpservletrequest). HandleRexeCutionChainProtected Object BuildPatexPositingHandler (Object Rawhandler, String BestMatchingPattern, String PathWithItHinmaping, Map <String, String> UrtemplateVariables) {}AbstractDeTectingUrlHandlerMapping, это не расширено, пожалуйста, подробно перейдите в подробности <SpringMVC Инициализация исходного кода - Инициализация серии SpringMVC> Инициализация серии>
Что делать:
1. Позвоните детектористам, чтобы сканировать objct, перезаписывая initapplicationContext
2. Предоставьте метод крюка определить, что нужно для подкласса. Создание URL
3. Позвоните в Registerhandler родительского класса, чтобы зарегистрироваться
@OverridePublic void initapplicationContext () throws ApplicationContexTextexception {super.InitApplicationContext (); detecThandlers ();} Защищенные детектористы void () Throws BeanSexcept Beanname); AbstractControllerUrlHandlerMapping, это не расширяется, пожалуйста, подробно перейдите в подробности <SpringMVC Инициализация исходного кода - Инициализация серии SpringMVC> Инициализация серии> Что делать конкретно;
1. Перезаписывайте DegineUrlsForHandler, чтобы добавить логику для удаления некоторых классов, и используйте исключенные классы и исключают пакки, настроенные в файле конфигурации.
2. Определите, является ли подкласс контроллера
3. Резервник Buildurlsforhandler для создания URL -адресов для подклассов
@OverrideProtected String [] degineUrlSforHandler (String beanname) {class beanclass = getApplicationContext (). GetType (beanname); if (iselegibleformapping (beanname, beanclass)) {return buildurlsforhandler (beanname, beanclass); IseLieGibleFormapping (String BeanName, Class Beanclass) {} защищенный логический iscontrollertype (class beanclass) {} защищенная абстрактная строка [] buildurlsforhandler (String beanname, Class beanclass); ControllerBeanNameHandLermapping и ControlerClassNameHandLermApping Взгляд на исходный код напрямую или перейдите к <SpringMVC Инициализацию исходного кода - Инициализация исходного кода SpringMVC SimpleUrlHandLermapping непосредственно настраивает URL -адрес для обработчика в файле конфигурации, который предназначен для использования registerhandlers для регистрации обработчика в документе конфигурации, прямо считывает код или перемещение <Springmvc Spurnation - Handlermapping - SimpleUrlHandLermapping инициализация>
BeanNameUrlHandlerMapping Reflaments DegineUrlsForHandler для генерации URL -адресов, напрямую посмотрите на код или перемещайте <SpringMVC Инициализация исходного кода - Инициализация исходного кода.
Использование @Controller, @Requestmapping на основе аннотации
Самая сложная кость
Давайте сначала посмотрим на наследство класса
Давайте поговорим о обязанностях каждой категории. Для конкретного анализа, пожалуйста, перейдите к следующей статье
<SpringMVC Инициализация исходного кода - Инициализация исходного кода -
<SpringMVC Strotnation - Handlermapping - DistermappingHappingHandlermapping Distribution>
1. AbstracThandlerMethodMaping определяет процесс инициализации и как его картировать при запросе
Инициализация:
1.1.1 Сканировать объект в соответствии с приложением
1.1.2 Зарезервировать метод крюка Ishandler для подкласса, чтобы определить, является ли объект обработчиком
1.1.3 Итеративно сканируйте каждый обработчик, чтобы найти метод, который соответствует требованиям. Суждение здесь все еще остается на подкласс для реализации getMappingFormethod
1.1.4 При регистрации найденного процессора необходимо убедиться, что соответствующая задача запроса условий может отображаться только с обработчиком
1.1.5 Получите URL в соответствии с условиями соответствия, и то же самое просто для определения процесса. Конкретный алгоритм оставлен на подкласс для реализации getmappathpatterns
Обработка распределения запросов:
1.2.1 Метод прямого сопоставления строк, обработчик поиска вверх
1.2.2 Поиск соответствия условия, конкретный алгоритм здесь передается подклассу, чтобы GetMatchingMapping
1.2.3 Сортируйте и получите лучший подходящий обработчик. Метод сортировки здесь все еще остается подключением обработки GetmappingConparator
1.2.4 Инкапсуляция сопоставления и не подходящие обработчики соответственно
2. requestMappingInfohandLermapping использует requestMappingInfo для реализации условий сопоставления, а инициализация requestMappingInfo остается на подкласс.
2.1 Сгенерировать URL -> getMappingPathPatterns в соответствии с requestMappingInfo
2.2 Найти обработчик с использованием условий сопоставления -> getMatchingMapping
2.3 Алгоритм компаратора -> GetMappingComparator
2.4 перезаписать Handlematch и кэш n несколько информации для запроса
Паттерн регистрации, лучший шаблон соответствия, анализовые параметры в URL-адресах, параметры с несколькими значениями, проанализированные в URL, MediaType
2.1.5 перезаписать Handlernomatch, попробуйте соответствовать его снова после последней борьбы
3. requestMappingHandlermapping Generate requestMappingInfo в соответствии с аннотацией @controller @requestmapping и проверьте ishandler
3.1 перезаписать Afterpropertiesset и добавить суффикс файлов, чтобы судить
3.2 Реализация Ishandler, и одна из аннотаций в классе верна.
3.3 Проанализируйте содержимое аннотации и создайте экземпляры запроса на предприятие.