注解式入口(SPI)
public class MyStarterInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
@Override
protected Class>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
父容器配置
@Configuration
@ComponentScan(
basePackages = "org.example.springmvc.annotation",
excludeFilters ={
@ComponentScan.Filter(type = FilterType.ANNOTATION,value = {RestController.class, Controller.class}),
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = WebConfig.class)
}
)
public class RootConfig {
}
子容器配置(按需配置)
@Configuration
@ComponentScan(
basePackages = "org.example.springmvc.annotation",
includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, value = {RestController.class, Controller.class})
}
)
@EnableWebMvc //
public class WebConfig implements WebMvcConfigurer {
@Bean
public MyIntercepter myIntercepter() {
return new MyIntercepter();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myIntercepter())
.addPathPatterns("
protected void registerDispatcherServlet(ServletContext servletContext) {
//创建子容器
WebApplicationContext servletAppContext = this.createServletApplicationContext();
//实例化DispatcherServlet
frameworkServlet dispatcherServlet=this.createDispatcherServlet(servletAppContext);
dispatcherServlet.setContextInitializers(getServletApplicationContextInitializers());
Dynamic registration = servletContext.addServlet(servletName, dispatcherServlet);
// 1
registration.setLoadonStartup(1);
registration.addMapping(this.getServletMappings());
registration.setAsyncSupported(this.isAsyncSupported());
Filter[] filters = this.getServletFilters();
if (!ObjectUtils.isEmpty(filters)) {
Filter[] var7 = filters;
int var8 = filters.length;
for(int var9 = 0; var9 < var8; ++var9) {
Filter filter = var7[var9];
this.registerServletFilter(servletContext, filter);
}
}
this.customizeRegistration(registration);
}
上述关键代码,实例化子父容器、Servlet、监听器。
listenerStart()------启动父容器
loadonStartup(findChildren()----启动子容器



