Несколько дней назад мой коллега спросил меня о том, как сервлет 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”