spring-boot - Какой фрагмент кода на самом деле регистрирует диспетчерский сервлет для springMVC?

Я пытаюсь выяснить в spring-boot, какая реализация WebApplicationInitializer реально зарегистрировать диспетчерский сервлет.

Я не нашел никакого кода от SpringBootServletInitializer или его родительские типы сделали это.

Вместо, AbstractDispatcherServletInitializer делает работу, но это абстрактно, я не могу найти какую-либо конкретную реализацию с помощью Eclipse.

Итак, какой фрагмент кода из какого класса фактически вызывается для регистрации сервлета диспетчера для SpringMVC?

Это следующий вопрос: как spring-boot может обслуживать определенные URL?

3 ответа

Решение

Ниже приведено описание шагов инициализации Spring Boot, которые в конечном итоге регистрируются DispatcherServlet,

Пример кода

@EnableAutoConfiguration
public class TestSpring {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(TestSpring.class, args);
    }
}

Шаги инициализации Spring Boot

Вот шаги:

  1. SpringApplication.run() создает EmbeddedWebApplicationContext контекст приложения;
  2. Называет его refresh() Способ;
  3. Процесс обновления читает аннотации начального класса TestSpring, Ищет импортные аннотации. EnableAutoConfiguration это один из них. Для аннотации импорта процесс обновления получает соответствующий класс из аннотации value и вызывает его selectImports() Способ;
  4. В случае @EnableAutoConfiguration соответствующий класс EnableAutoConfigurationImportSelector чья selectImports() загружает тонны других селекторов импорта из META-INF/spring.factories;
  5. Этот процесс продолжается рекурсивно. Кроме того, все определения компонентов, которые находятся внутри этих селекторов импорта, читаются. Т.е. он включает бины, определенные методом с @Bean аннотации, то есть bean-компоненты, которые требуют, чтобы контекст Spring автоматически вызывал соответствующий метод для их создания;
  6. resfresh() продолжается и достигает onRefresh(), createEmbeddedServletContainer() метод вызывается изнутри;
  7. Среди операций чтения bean-компонентов на предыдущем шаге, реализация bean-компонентов ServletContextInitializer разыскиваются и создаются. Одним из них является боб, определяемый DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration#dispatcherServletRegistration() метод ServletRegistrationBean тип, который расширяет ServletContextInitializer, Как вы можете догадаться по названию класса, такие инициализаторы добавляют данный сервлет (в данном случае DispatcherServlet) к данному ServletContext когда их onStartup() метод вызывается;
  8. Создан встроенный сервер tomcat (еще не запущен полностью). Все найдено ServletContextInitializer s на предыдущем шаге передаются в эту инициализацию tomcat - это где onStartup() методы тех ServletContextInitializer называются и DispatcherServlet создается и регистрируется как сервлет;
  9. Конец чего-либо onRefresh() контекста приложения;
  10. finishRefresh() называется там, где наконец начинается tomcat TomcatEmbeddedServletContainer.start();
  11. Конец чего-либо refresh() контекста приложения и других заключительных этапов инициализации;
  12. Приложение работает.

Когда вы ищете что-то, что Spring Boot делает во время автоконфигурации, вы должны посмотреть в *AutoConfiguration классы. В этом случае, DispatcherServletAutoConfiguration,

Если вы хотите развернуть приложение Spring Boot как традиционную WAR, то в спецификации Servlet 3.0 подробно описано, как поставщики услуг могут настроить его так, чтобы контейнер сервлета, совместимый с 3.0, автоматически загружал любые веб-ресурсы (Servlet, Filter, ServletContextInitializer's) в сервлет. контейнер. "Волшебство" достигается в зависимости от сети. Если вы отключите его, вы найдете файл "spring-web/META-INF/services/javax.servlet.ServletContainerInitializer". Откройте файл, и вы увидите одну строку "org.springframework.web.SpringServletContainerInitializer". Этот класс делегирует всем классам, которые реализуют WebApplicationInitializer, более конкретно их метод onStartup(ServletContext servletContext). В Spring Boot мне известен один такой конкретный класс, а именно SpringBootServletInitializer.

Другие вопросы по тегам