Я использую 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?
По умолчанию в веб-приложении Spring Boot (или другом) есть один контекст приложения. Он создается SpringApplication при запуске вашего приложения.
если мне нужно создать Servlet WebApplicationContext, мне нужно расширить AbstractAnnotationConfigDispatcherServletInitializer?
В Spring Boot нет различия между контекстом корневого веб-приложения и контекстом веб-приложения сервлета. По умолчанию при запуске приложения создается единый контекст веб-приложения. Вы можете создать дочерний контекст, если хотите, используя SpringApplicationBuilder. Вы не должны разделять AbstractAnnotationConfigDispatcherServletInitializer или AbstractDispatcherServletInitializer на подклассы. Я рекомендую задать другой вопрос, который описывает, что вы пытаетесь сделать на более высоком уровне. Ваше текущее решение не подходит для Spring Boot.
@AndyWilkinson, а знаете ли вы, почему было решено сохранить все в одном контексте приложения вместо того, чтобы хранить их отдельно? У вас есть какие-нибудь полезные ссылки по этому поводу?
Это было дизайнерское решение, принятое на заре Spring Boot. Иерархия контекста добавляет сложности, и не все извлекут из этого пользу. Таким образом, кажется лучше сделать это добровольным, а не чем-то, что должен использовать каждый.
Правильный способ сделать это:
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, будут использоваться во всех дочерних контекстах.
так что по умолчанию сборка весенней загрузки Root WebApplicationContext?