# 《Spring核心技术》第42章:注解型SpringMVC通用SpringBoot启动模型设计与实现
作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码地址:https://github.com/binghe001/spring-annotation-book/tree/master/spring-annotation-chapter-42 (opens new window)
沉淀,成长,突破,帮助他人,成就自我。
大家好,我是冰河~~
本章难度:★★★★☆
本章重点:掌握基于全注解开发SpringMVC的方法,掌握使用嵌入式Tomcat启动SpringMVC的方法(摒弃web.xml),对比思考SpringBoot。
本章目录如下所示:
- 学习指引
- 模型设计
- Tomcat SPI 接口
- Tomcat SPI 实现类
- Tomcat SPI 扩展设计
- 模型实现
- 案例实现
- 案例测试
- 总结
- 思考
- VIP服务
# 一、学习指引
你还在写大量配置文件来开发SpringMVC程序?
很早前,冰河就说过,SpringBoot其实底层就是基于Spring和SpringMVC的一个快速开发脚手架,SpringBoot能做到的,使用Spring和SpringMVC一样能做到,SpringBoot其实并没有什么神秘的地方,学好Spring和SpringMVC,那SpringBoot根本就不用花费大量的时间和精力去学习,只要稍加理解就可以了。
为了让大家更好的体会如何利用Spring和SpringMVC按照SpringBoot的方式开发Web应用程序,本章,我们一起使用Spring+SpringMVC+嵌入式Tomcat开发一个简易版的SpringBoot应用。让你从根本上理解SpringBoot到底是如何运行的。还有一点需要说明的是:SpringBoot启动时,底层使用的是自动配置导入相关的类和资源,这个在《RPC手撸专栏》的整合SpringBoot篇章有实现。这里,为了简化实现逻辑,也为了更好的演示最核心的部分,省略了大量的自动配置,通过嵌入式Tomcat直接启动程序。
# 二、模型设计
基于SpringMVC实现SpringBoot方式启动程序案例模型设计~~
熟悉Tomcat的小伙伴都知道,Tomcat提供了一种SPI机制来加载配置类启动Spring IOC容器。所以,本章在实现注解型SpringMVC通用SpringBoot启动模型时,会基于Tomcat的SPI机制进行实现。
# 2.1 Tomcat SPI 接口
在Tomcat提供的SPI机制中,会对外暴露一个ServletContainerInitializer接口,ServletContainerInitializer接口的源码详见:jakarta.servlet.ServletContainerInitializer。
public interface ServletContainerInitializer {
void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException;
}
2
3
可以看到,在ServletContainerInitializer接口中只提供了一个onStartup()方法,在Tomcat启动的过程中就会调用这个onStartup()方法。
在Tomcat启动的过程中,就会去加载ServletContainerInitializer接口的所有实现类,并且还会去解析@HandlersTypes注解,将解析到的结果信息封装到一个Set<Class<?>>集合中。
# 2.2 Tomcat SPI 实现类
在spring-web模块会实现ServletContainerInitializer接口,如图42-1所示。
由图42-1可以看出,在spring-web模块中就实现了ServletContainerInitializer接口,打开jakarta.servlet.ServletContainerInitializer文件,内容如下所示。
# 查看完整文章
加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码