怎么在Springboot 2中调用外部Tomcat源码

  介绍

怎么在Springboot 2中调用外部Tomcat源码?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1。修改砰的一声。xml,改为打战争包

<代码> & lt; packaging> war

2。将Springboot内置tomcat作用域改为提供

& lt; dependency>   & lt;才能groupId> org.springframework.boot</groupId>   & lt;才能artifactId> spring-boot-starter-tomcat</artifactId>   & lt;才能scope> provided</scope>   & lt;/dependency>

3。重写SpringBootServletInitializer

@SpringBootApplication   public  class  Bootstrap  extends  SpringBootServletInitializer  {   ,public  static  void  main (String [], args), {   SpringApplication.run才能(Bootstrap.class, args);   ,}   ,@Override   ,protected  SpringApplicationBuilder 配置(SpringApplicationBuilder 构建器),{   return 才能builder.sources (Bootstrap.class);   ,}   }

4。maven打包出战争包后,放到tomcat的webapps目录下即可。

如果要访问该战争包的接口,默认需要在url加项目名作为前缀,例如:http://localhost: 8080/{项目名}/用户/123456

<强>原理分析

ServletContainerInitializer

Servlet容器启动时,会扫描当前应用每个jar包路径meta - inf \服务下的文件javax.servlet。ServletContainerInitializer,其文件内容就是ServletContainerInitializer的实现类全类名,并调用其>//,容器启动时,将,WebApplicationInitializer 的所有子类传递至,webAppInitializerClasses   @HandlesTypes (WebApplicationInitializer.class)   public  class  SpringServletContainerInitializer  implements  ServletContainerInitializer  {   ,/* *   ,,*,@param  webAppInitializerClasses  @HandlesTypes 导入的类   ,,*,@param  servletContext 当前,web 应用,servlet 上下文   ,,*/@Override才能   public 才能;void  onStartup (@Nullable  Set< Class<?在祝辞,webAppInitializerClasses,, ServletContext  servletContext), throws  ServletException  {   ,,,List, initializers =, new  LinkedList<在();   ,,,for  (Class<?祝辞,waiClass :, webAppInitializerClasses), {   ,,,,,//,过滤出可用的,WebApplicationInitializer   ,,,,,if  (! waiClass.isInterface (),,,, ! Modifier.isAbstract (waiClass.getModifiers ()),,,, WebApplicationInitializer.class.isAssignableFrom (waiClass)), {   ,,,,,,,initializers.add ((WebApplicationInitializer) ReflectionUtils.accessibleConstructor (waiClass) .newInstance ());   ,,,,,}   ,,,}   ,,,for  (WebApplicationInitializer  initializer :初始化器),{   ,,,,,initializer.onStartup (servletContext);   ,,,}   ,,}   }

容器启动时,执行<代码> SpringServletContainerInitializer.onStartup() 方法,@HandlesTypes注解声明了<代码> WebApplicationInitializer> SpringBootServletInitializer>

onStartup()方法会过滤出webAppInitializerClasses中可用的<代码> WebApplicationInitializer 子类引导,然后回调<代码> SpringBootServletInitializer的> public  void  onStartup (ServletContext  servletContext), throws  ServletException  {   WebApplicationContext 才能;rootAppContext =, createRootApplicationContext (servletContext);   }   protected  WebApplicationContext  createRootApplicationContext (ServletContext  servletContext), {   SpringApplicationBuilder 才能;builder =, createSpringApplicationBuilder ();//才能,指定主类,引导   builder.main才能(getClass ());//,才能回调,Bootstrap 重写的方法   builder =,才能配置(施工);   return 才能;运行(builder.build ());   }

这个方法会配置当前网络应用程序上下文环境:指定主类,注册servletContext,调用配置(),运行运行。

由于引导重写了配置(),所以会执行重写的方法来指定主类,最后通过运行来完成启动Springboot应用。

关于怎么在Springboot 2中调用外部Tomcat源码问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

怎么在Springboot 2中调用外部Tomcat源码