Рубрики
Без рубрики

Как Dispatcherservlet регистрируется в конфигурации на основе Spring java

Несколько дней назад мой коллега спросил меня о том, как сервлет Spring Dispatcher регистрируется на Java… Помеченный java, spring, springframework.

Несколько дней назад мой коллега спросил меня о том, как сервлет Spring Dispatcher регистрируется в конфигурации на основе Java, поскольку в конфигурации не используется XML. В одном я был (на самом деле мы оба были) уверены, что класс AbstractAnnotationConfigDispatcherServletInitializer регистрирует этот сервлет и всю конфигурацию. Но вопрос был в том, как?

Чтобы понять это, мы вернемся в мир сервлетов. Согласно JavaDoc сервлета , Servletcontainerинициализатор – это интерфейс, который используется для регистрации сервлетов, фильтров и других связанных с ними вещей.

Таким образом, любая реализация Инициализатор содержимого сервлета будет уведомлен о этапе запуска веб-приложения с использованием метода обратного вызова

public void onStartup(Set> c, ServletContext ctx) throws ServletException {

}

В приведенном выше методе вы заметите, что есть параметр c набора типов<Класс > >. Вы, наверное, думаете о том, почему он там находится. Итак, вот еще одна часть волшебства, есть аннотация под названием @HandlesTypes , используемая вместе Инициализатор содержимого сервлета . Аннотация принимает массив класса в качестве входного аргумента.

public @interface HandlesTypes {

    Class[] value();
}

Таким образом, любой класс (и его подклассы), который передается в качестве аргумента этой аннотации ( Типы обработки ), будет сканироваться контейнером, и, наконец, коллекция этого класса будет передана в ServletContainerInitializer#OnStartup() во время запуска.

Теперь вы, возможно, думаете, как реализация Инициализатор ServletContainerInitializer выбирается контейнером? Итак, ответ на этот вопрос таков:

В соответствии с JavaDocs

Реализации этого интерфейса должны быть объявлены файловым ресурсом JAR, расположенным внутри каталога META-INF/services и названным в соответствии с полным именем класса этого интерфейса, и будут обнаружены с помощью механизма поиска поставщика услуг среды выполнения или механизма, специфичного для контейнера, который семантически эквивалентен ему. В любом случае службы ServletContainerInitializer из файлов JAR веб-фрагментов, исключенных из абсолютного порядка, должны игнорироваться, и порядок, в котором обнаруживаются эти службы, должен соответствовать модели делегирования загрузки классов приложения.

Теперь вернитесь к источнику Здесь и проверьте spring-web*.jar (просто извлеките банку) и найдите файл javax.сервлет. Инициализатор содержимого сервлета . Внутри этого файла вы найдете полное имя класса как org.springframework.web. Инициализатор springservletcontainer .

Вот и все, вы разгадали тайну!!

Теперь проверьте исходный код этого класса (перейдите в GitHub ), вы заметите класс WebApplicationInitializer внутри @handlestypes , который является родительским классом большинства инициализаторов Spring ( AbstractAnnotationConfigDispatcherServletInitializer , abstractsecuritywebapplicationinitializer ).

Теперь вы знаете, как создать свой собственный инициализатор.

Ваше здоровье!!! Счастливого кодирования.

Пожалуйста, поделитесь своими мыслями. Краснеть краснеть

Оригинал: “https://dev.to/jeetmp3/how-dispatcher-servlet-gets-registered-in-spring-java-based-config-4nnc”