一、介绍
一般我们启动web服务都需要单独的去安装tomcat,而Springboot自身却直接整合了Tomcat,什么原理呢?
二、原理
SpringBoot应用只需要引入spring-boot-starter-web中这个依赖,应用程序就默认引入了tomcat依赖,其实这主要是Tomcat本身提供的外部接口(org.apache.catalina.startup.Tomcat),使其它应用程序能够非常方便的将Tomcat嵌入到自身的应用来。
下面是从网络上找的一个自身的程序嵌入如何实现嵌入式Tomcat,达到和Springboot类似的效果:
<dependency><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></dependency>
定义一个简单的一个servlet类(提供web服务):
public class DemoServlet extends HttpServlet {private static final long serialVersionUID = 1L;@Overridepublic void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException {response.setContentType("text/html");response.setCharacterEncoding("UTF-8");PrintWriter out = response.getWriter();out.println("<!DOCTYPE html><html>");out.println("<head>");out.println("<meta charset="UTF-8" />");out.println("<title></title>");out.println("</head>");out.println("<body bgcolor="white">");out.println("<h1> 嵌入式tomcat</h1>");out.println("</body>");out.println("</html>");}
}
定义一个EmbeddedTomcatServer类,主程序执行入口:
EmbeddedTomcatServer类作为程序的入口,代码逻辑其实就是通过tomcat提供的外部接口类修改server.xml这个文件;
public class EmbeddedTomcatServer {public static void main(String[] args) throws Exception {//把目录的绝对的路径获取到String classpath = System.getProperty("user.dir");System.out.println(classpath);//new一个TomcatTomcat tomcat = new Tomcat();//插件是6或者6以前的//Embbedded//设置Tomcat的端口//tomcat.setPort(9090);Connector connector = tomcat.getConnector();connector.setPort(9091);//设置HostHost host = tomcat.getHost();//我们会根据xml配置文件来host.setName("localhost");host.setAppBase("webapps");//前面的那个步骤只是把Tomcat起起来了,但是没啥东西//要把class加载进来,把启动的工程加入进来了Context context = tomcat.addContext(host, "/", classpath);if (context instanceof StandardContext) {StandardContext standardContext = (StandardContext) context;standardContext.setDefaultContextXml("E:\apache-tomcat-8.5.51\conf\web.xml");//我们要把Servlet设置进去Wrapper wrapper = tomcat.addServlet("/", "DemoServlet", new DemoServlet());wrapper.addMapping("/embeddedTomcat");}//Tomcat跑起来tomcat.start();//强制Tomcat server等待,避免main线程执行结束后关闭tomcat.getServer().await();}}
三、SpringBoot接入原理
SpringBoot嵌入Tomcat的原理其实和上面的案例是一样的,我们来看下代码:
首先进入run方法,并点击refreshContext(context)方法:
如下可知,底层就是用的Tomcat类实现。
参考:
SpringBoot内嵌Tomcat原理剖析_普通网友的博客-CSDN博客_springboot内嵌tomcat原理