天天看點

Springboot内置tomcat原理springmvc注解版結合内置的tomcat

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實作類的全限定名。

Springboot内置tomcat原理springmvc注解版結合内置的tomcat
Springboot内置tomcat原理springmvc注解版結合内置的tomcat

結合内置的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

歡迎點贊和關注

繼續閱讀