欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > springboot使用tomcat浅析

springboot使用tomcat浅析

2025/2/7 3:38:21 来源:https://blog.csdn.net/weixin_42112831/article/details/145348277  浏览:    关键词:springboot使用tomcat浅析

springboot使用tomcat浅析

关于外部tomcat

maven pom配置

// 打包时jar包改为war包
<packaging>war</packaging>// 内嵌的tomcat的scope标签影响范围设置为provided,只在编译和测试时有效,打包时不带入
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope>
</dependency>

启动类需继承SpringBootServletInitializer并复写configure方法

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder){return builder.sources(this.getClass());// 还可以显式声明应用类型WebApplicationType// return builder.sources(this.getClass()).web(WebApplicationType.NONE);
}

应用类型WebApplicationType分三种

NONE:应用程序不作为web应用启动,不启动内嵌的服务。
SERVLET:应用程序以基于servlet的web应用启动,需启动内嵌servlet web服务。
REACTIVE:应用程序以响应式web应用启动,需启动内嵌的响应式web服务。

configure调用关系
在这里插入图片描述

关于内嵌tomcat

利用了构造函数new Tomcat()创建tomcat对象。可以引入以下maven依赖。

<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>xxx</version>
</dependency>
<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-el</artifactId><version>xxx</version>
</dependency>
<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId><version>xxx</version>
</dependency>

消失的Web.xml

servlet3.0后springMVC提供了WebApplicationInitializer接口替代了Web.xml。而JavaConfig的方式替代了springmvc-config.xml

servlet3.0特性之ServletContainerInitializer

参考8.2.4节。也称SCI接口,约定了servlet容器启动时,会扫描当前应用里面每一个jar包的ServletContainerInitializer的实现,利用了SPI机制。可参考tomcat的org.apache.catalina.startup.ContextConfig#processServletContainerInitializers方法。

/*** Scan JARs for ServletContainerInitializer implementations.*/
protected void processServletContainerInitializers()

tomcat启动时触发调用了configureStart方法
在这里插入图片描述

springMVC之ServletContainerInitializer实现

调用链入口

spring-web-xxx.jar里META-INF/services/javax.servlet.ServletContainerInitializer文件,
定义了实现类org.springframework.web.SpringServletContainerInitializer

onStartup调用关系

在这里插入图片描述

关于@HandlesTypes注解

属于servlet3.0规范,在javax.servlet.annotation包里。作用是在onStartup方法的入参上,传入注解@HandlesTypes定义的类型
在springMVC上的使用

@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {@Overridepublic void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)throws ServletException {... }...
}

在tomcat上的使用,调用链为

参考org.apache.catalina.startup.ContextConfig
1)在processServletContainerInitializers方法,记录下注解名
2)在processAnnotationsStream方法,使用bcel字节码工具org.apache.tomcat.util.bcel直接读取字节码文件,判断是否与记录的注解类名相同
3)若相同再通过org.apache.catalina.util.Introspection类load为Class对象,最后保存起来
4)在Step 11中交给org.apache.catalina.core.StandardContext,也就是tomcat实际调用ServletContainerInitializer.onStartup()的地方。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com