Весенняя загрузка, где находится Root WebApplicationContext и Servlet WebApplicationContext

Я использую spring-boot-starter-web 1.5.17. Я не могу найти никакой автоматической конфигурации для сборки Root WebApplicationContext и Servlet WebApplicationContext.

Когда не используем пружинный ботинок, нам нужно сделать это

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected String[] getServletMappings() {
    return new String[]{"/"};
}


@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[]{SecurityAdminConfig.class, DataSourceConfig.class, JavaConfig.class};
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[]{WebMvcConfig.class};
}
//controller、service

Я знаю, что WebMvcAutoConfiguration выполняет много настроек Spring MVC, но я не могу найти информацию об автоматической сборке Root WebApplicationContext и Servlet WebApplicationContext.

public abstract class AbstractAnnotationConfigDispatcherServletInitializer
    extends AbstractDispatcherServletInitializer {

@Override
protected WebApplicationContext createRootApplicationContext() {
    Class<?>[] configClasses = getRootConfigClasses();
    if (!ObjectUtils.isEmpty(configClasses)) {
        AnnotationConfigWebApplicationContext rootAppContext = new AnnotationConfigWebApplicationContext();
        rootAppContext.register(configClasses);
        return rootAppContext;
    }
    else {
        return null;
    }
}

@Override
protected WebApplicationContext createServletApplicationContext() {
    AnnotationConfigWebApplicationContext servletAppContext = new AnnotationConfigWebApplicationContext();
    Class<?>[] configClasses = getServletConfigClasses();
    if (!ObjectUtils.isEmpty(configClasses)) {
        servletAppContext.register(configClasses);
    }
    return servletAppContext;
}


protected abstract Class<?>[] getRootConfigClasses();


protected abstract Class<?>[] getServletConfigClasses();

}

Как можно узнать, что этот bean-компонент является корневым WebApplicationContext или Servlet WebApplicationContext?

изображение здесь

2
0
830
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

По умолчанию в веб-приложении Spring Boot (или другом) есть один контекст приложения. Он создается SpringApplication при запуске вашего приложения.

так что по умолчанию сборка весенней загрузки Root WebApplicationContext?

Harvey Lan 20.11.2018 02:33

если мне нужно создать Servlet WebApplicationContext, мне нужно расширить AbstractAnnotationConfigDispatcherServletInitializer?

Harvey Lan 20.11.2018 02:34

В Spring Boot нет различия между контекстом корневого веб-приложения и контекстом веб-приложения сервлета. По умолчанию при запуске приложения создается единый контекст веб-приложения. Вы можете создать дочерний контекст, если хотите, используя SpringApplicationBuilder. Вы не должны разделять AbstractAnnotationConfigDispatcherServletInitializer или AbstractDispatcherServletInitializer на подклассы. Я рекомендую задать другой вопрос, который описывает, что вы пытаетесь сделать на более высоком уровне. Ваше текущее решение не подходит для Spring Boot.

Andy Wilkinson 20.11.2018 12:35

@AndyWilkinson, а знаете ли вы, почему было решено сохранить все в одном контексте приложения вместо того, чтобы хранить их отдельно? У вас есть какие-нибудь полезные ссылки по этому поводу?

Vadim Kirilchuk 25.06.2019 14:47

Это было дизайнерское решение, принятое на заре Spring Boot. Иерархия контекста добавляет сложности, и не все извлекут из этого пользу. Таким образом, кажется лучше сделать это добровольным, а не чем-то, что должен использовать каждый.

Andy Wilkinson 25.06.2019 18:34

Правильный способ сделать это:

public class App {
    public static void main(String[] args) {
        new SpringApplicationBuilder()
          .parent(ParentConfig.class).web(WebApplicationType.NONE)
          .child(WebConfig.class).web(WebApplicationType.SERVLET)
          .sibling(RestConfig.class).web(WebApplicationType.SERVLET)
          .run(args);
    }
}

Взял с здесь: Однако до сих пор непонятно, почему по умолчанию все находится в одном контексте .. Кроме того, я не уверен, что это нормально, что другие bean-компоненты, созданные WebMvcAutoconfiguration, будут использоваться во всех дочерних контекстах.

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