Springboot内置tomcat原理
- springmvc注解版
- 結合内置的tomcat
springmvc注解版
打開官網關于springmvc, 已經給了兩種方式。連結: Springmvc
第一種
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletCxt) {
// Load Spring web application configuration
AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
ac.register(AppConfig.class);
ac.refresh();
// Create and register the DispatcherServlet
DispatcherServlet servlet = new DispatcherServlet(ac);
ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);
registration.setLoadOnStartup(1);
registration.addMapping("/app/*");
}
}
第二種
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { App1Config.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/app1/*" };
}
}
對應的xml配置
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-context.xml</param-value>
</context-param>
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
原理:
ServletContainerInitializer是servlet3.0規範中引入的接口,能夠讓web應用程式在servlet容器啟動後做一些自定義的操作。
ServletContainerInitializer 基于服務提供者接口(SPI)概念,是以你需要在你的jar包目錄下添加META-INF/services/javax.servlet.ServletContainerInitializer檔案,内容就是ServletContainerInitializer實作類的全限定名。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN2XjlGcjAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL9gTMaVnRyQ2dBpnTyhmMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxcTN3IzN1ADM2EDOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
結合内置的tomcat
public class App {
public static void main(String[] args) {
Tomcat tomcat = new Tomcat();
tomcat.setPort(9999);
Connector conn = tomcat.getConnector(); // Tomcat 9.0 必須調用 Tomcat#getConnector() 方法之後才會監聽端口
System.out.println("連接配接器設定完成: " + conn);
try {
tomcat.addWebapp("/", "D:\\boot");
tomcat.start();
tomcat.getServer().await();
} catch (LifecycleException e) {
e.printStackTrace();
}
}
}
tomcat作為servlet規範的實作者,預設會掃描classpath包下ServletContainerInitializer的類,作為入口,進而實作内置。
具體代碼目錄:https://github.com/peter-anything/springmvc
歡迎點贊和關注