外部ソース分析を用いSpringboot 2のTomcat

外部Tomcatを使用してSpringboot

1.代わりに戦争のパック遊ぶのpom.xmlを修正
<packaging>war</packaging>
2. Springboot構築されたTomcatのスコープを変更provided

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

3.書き換えSpringBootServletInitializer

@SpringBootApplication
public class Bootstrap extends SpringBootServletInitializer {
  public static void main(String[] args) {
    SpringApplication.run(Bootstrap.class, args);
  }

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    return builder.sources(Bootstrap.class);
  }
}

戦争4.maven包装袋の後、Tomcatののwebappsディレクトリにそれを置きます。

戦争のパッケージにアクセスするためのインターフェイス、デフォルトのURLたとえば、接頭辞としてプロジェクト名を追加する必要があります。http:// localhost:8080 / {プロジェクト名} /ユーザー/ 123456

原理分析

ServletContainerInitializer

サーブレットコンテナが起動すると、各ジャーパッケージの現在のアプリケーションパススキャンMETA-INF\services内のファイルjavax.servlet.ServletContainerInitializerそのファイルの内容は、ServletContainerInitializer実装クラスの完全なクラス名であり、そのonStartup()メソッドを呼び出します。たとえば、春のWebパッケージでは、ファイルの内容がされorg.springframework.web.SpringServletContainerInitializer、以下のように、そのソースコードは次のとおりです。

// 容器启动时,将 WebApplicationInitializer 的所有子类传递至 webAppInitializerClasses
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
    /**
     * @param webAppInitializerClasses @HandlesTypes 导入的类
     * @param servletContext 当前 web 应用 servlet 上下文
     */
    @Override
    public void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException {
        List<WebApplicationInitializer> initializers = new LinkedList<>();
        for (Class<?> waiClass : webAppInitializerClasses) {
            // 过滤出可用的 WebApplicationInitializer
            if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) && WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
                initializers.add((WebApplicationInitializer)ReflectionUtils.accessibleConstructor(waiClass).newInstance());
            }
        }
        for (WebApplicationInitializer initializer : initializers) {
            initializer.onStartup(servletContext);
        }
    }
}

コンテナが開始されると、実行SpringServletContainerInitializer.onStartup()メソッドは、HandlesTypes @注釈はすべてのサブクラスWebApplicationInitializer(前の例では、クラスはブートストラップが実装開始することを宣言しSpringBootServletInitializerは、パラメータwebAppInitializerClassesメソッドに渡されるその実現Aです)。

OnStartup()メソッドは、ブートストラップWebApplicationInitializerサブクラスで利用可能webAppInitializerClassesをフィルタリングし、コールバックSpringBootServletInitializer OnStartupの()メソッドは、以下のソースコード:

public void onStartup(ServletContext servletContext) throws ServletException {
    WebApplicationContext rootAppContext = createRootApplicationContext(servletContext);
}
protected WebApplicationContext createRootApplicationContext(ServletContext servletContext) {
    SpringApplicationBuilder builder = createSpringApplicationBuilder();
    // 指定主类 Bootstrap
    builder.main(getClass());
    // 回调 Bootstrap 重写的方法
    builder = configure(builder);
    return run(builder.build());
}

このメソッドは、現在のWebアプリケーションのコンテキストを設定します。メインクラス、登録のServletContextを指定するには、configure()、実行実行を呼び出します。

設定ブートストラップを()書き換え、その方法は、メインクラスを指定するには、書き換えを実行し、最終的にはアプリケーションによって達成のでSpringboot実行を開始します。

おすすめ

転載: www.cnblogs.com/bigshark/p/11367140.html