Springboot 2使用外部Tomcat源码分析
Springboot使用外部Tomcat
1.修改pom.xml,改为打war包
2.将Springboot内置tomcat作用域改为provided
org.springframework.boot spring-boot-starter-tomcat provided
3.重写SpringBootServletInitializer
@SpringBootApplication
publicclassBootstrapextendsSpringBootServletInitializer{
publicstaticvoidmain(String[]args){
SpringApplication.run(Bootstrap.class,args);
}
@Override
protectedSpringApplicationBuilderconfigure(SpringApplicationBuilderbuilder){
returnbuilder.sources(Bootstrap.class);
}
}
4.maven打包出war包后,放到tomcat的webapps目录下即可。
如果要访问该war包的接口,默认需要在url加项目名作为前缀,例如:http://localhost:8080/{项目名}/users/123456
原理分析
ServletContainerInitializer
Servlet容器启动时,会扫描当前应用每个jar包路径META-INF\services下的文件javax.servlet.ServletContainerInitializer,其文件内容就是ServletContainerInitializer的实现类全类名,并调用其onStartup()方法。比如,在Spring-web包下,该文件内容就是
org.springframework.web.SpringServletContainerInitializer,其源码如下:
//容器启动时,将WebApplicationInitializer的所有子类传递至webAppInitializerClasses
@HandlesTypes(WebApplicationInitializer.class)
publicclassSpringServletContainerInitializerimplementsServletContainerInitializer{
/**
*@paramwebAppInitializerClasses@HandlesTypes导入的类
*@paramservletContext当前web应用servlet上下文
*/
@Override
publicvoidonStartup(@NullableSet>webAppInitializerClasses,ServletContextservletContext)throwsServletException{
Listinitializers=newLinkedList<>();
for(Class>waiClass:webAppInitializerClasses){
//过滤出可用的WebApplicationInitializer
if(!waiClass.isInterface()&&!Modifier.isAbstract(waiClass.getModifiers())&&WebApplicationInitializer.class.isAssignableFrom(waiClass)){
initializers.add((WebApplicationInitializer)ReflectionUtils.accessibleConstructor(waiClass).newInstance());
}
}
for(WebApplicationInitializerinitializer:initializers){
initializer.onStartup(servletContext);
}
}
}
容器启动时,执行SpringServletContainerInitializer.onStartup()方法,@HandlesTypes注解声明了WebApplicationInitializer的所有子类(在前面的示例中,启动类Bootstrap实现的SpringBootServletInitializer就是它的一个实现)会被传递给方法的参数webAppInitializerClasses。
onStartup()方法会过滤出webAppInitializerClasses中可用的WebApplicationInitializer子类Bootstrap,然后回调SpringBootServletInitializer的onStartup()方法,其源码如下:
publicvoidonStartup(ServletContextservletContext)throwsServletException{
WebApplicationContextrootAppContext=createRootApplicationContext(servletContext);
}
protectedWebApplicationContextcreateRootApplicationContext(ServletContextservletContext){
SpringApplicationBuilderbuilder=createSpringApplicationBuilder();
//指定主类Bootstrap
builder.main(getClass());
//回调Bootstrap重写的方法
builder=configure(builder);
returnrun(builder.build());
}
这个方法会配置当前web应用程序上下文环境:指定主类、注册servletContext、调用configure()、run运行。
由于Bootstrap重写了configure(),所以会执行重写的方法来指定主类,最后通过run来完成启动Springboot应用。
总结
以上所述是小编给大家介绍的Springboot2使用外部Tomcat源码分析,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。