【源码】spring boot
springboot
1.没有web.xml,tomcat和spring是如何关联的?
Servlet3.0规范,可以通过java配置(注解等)省去web.xml配置。3.0规范,容器启动时会去项目根目录下的META-INF/services下找javax.servlet.ServletContainerInitializer这个文件。容器启动后会加载这个文件中的类(必须要实现ServletContainerInitializer),springboot在这个文件中配置了SpringServletContainerInitializer,web容器启动后,调用所有实现WebApplicationInitializer的onStartup方法--(SpringBootServletInitializer)。在这个SpringBootServletInitializer的onStartup方法中,启动了整个Spring容器。容器启动时会根据配置类WebMvcAutoConfiguration将配置类注册进去。
(在本地调试时使用SpringApplication.run来手动启动容器)
/**
* @HandlesTypes这个注解标明了该ServletContainerInitializer需要在启动时候处理哪些类,
然后服务器会把找到的这些类传到onStartup的第一个参数里
注意这里的类包括所配置类的子类,比如这里配置WebApplicationInitializer,
启动之后,就会把这个WebApplicationInitializer的子类都传进去
*/
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
throws ServletException {
List<WebApplicationInitializer> initializers = new LinkedList<WebApplicationInitializer>();
//.... 省略容错的一些代码
initializers.add((WebApplicationInitializer) waiClass.newInstance());
//....
AnnotationAwareOrderComparator.sort(initializers);
for (WebApplicationInitializer initializer : initializers) {
initializer.onStartup(servletContext);
}
}
}

浙公网安备 33010602011771号