现在的开发中,微服务已经是主流的架构,Spring Boot与Spring Cloud大行其道。配置Tomcat Server,配置webapp的方式已经逐渐落伍了,Tomcat是如何在时代的浪潮中屹立不倒呢?原因是它提供了对外的接口,其他项目只需要调用接口就可以内嵌的启动一个Tomcat,而不需要繁杂的配置过程。如果快速的内嵌一个Tomcat呢?赶紧来试一下吧!
Tomcat嵌入式启动
1.需要给当前Maven项目依赖内嵌包
<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-core -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.33</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>9.0.33</version>
</dependency>
2.编写一个类,实现一个简单的Servlet
HttpServlet httpServlet = new HttpServlet() {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
res.getWriter().write("hello world.");
}
};
3.新建一个Tomat,同server.xml一致,先创建Context然后在其下创建具体的Servlet
// 引入嵌入式tomcat.
Tomcat tomcat = new Tomcat();
// 部署应用.
Context context = tomcat.addContext("/demo",null);
// 添加Servlet,为Servlet指定别名
Tomcat.addServlet(context,"hello",httpServlet);
// 添加映射规则
context.addServletMappingDecoded("/hello","hello");
// 启动tomcat.
try {
tomcat.init();
tomcat.start();
} catch (LifecycleException e) {
System.out.println("===============");
e.printStackTrace();
}
// 阻塞tomcat,等待请求过来.
tomcat.getServer().await();
4.访问http://localhost:8080/demo/hello即可看到效果
5.如果需要部署现成的web项目,直接添加即可
Tomcat tomcat = new Tomcat();
tomcat.addWebapp("项目war解压的path");
tomcat.init();
tomcat.start();
tomcat.getServer().await();
Spring Boot 中启动
在Spring Boot中封装了很多层,跟进一下run():
经过层层run()包装,到了此处,选择refreshContext继续跟进。
怎么知道在这个方法中的? 是因为Spring预留了一个onRefresh()来进行初始化时的额外操作(钩子方法),所以猜测在这里
果然,找到了我们想要的钩子。根据字面意思,选择这个web server的实现类。
使用一个特定的工厂创建了一个Web Server,按照我们的需要选择Tomcat工厂。
看一下这个工厂内部是怎么做的:
是不是跟我们上面内嵌Tomcat的代码很像?因此我们就得出了结论:Spring Boot就是使用内嵌式Tomcat启动的。