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{ List initializers=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。