spring 入門之spring boot 分析

接著新浪博客寫 上一篇 說到了 spring boot是自帶servlet 容器的 那么神奇之處在哪里呢?

其實看看 maven 的pom文件 的依賴便知道了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring Boot工程的默認web容器是Tomcat,但是開發人員可以根據需要修改,例如使用Jetty或者Undertow,Spring Boot提供了對應的starters。
其實根據需求在pom的文件重排除tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
然后加入自己想要的依賴的servlet容器即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
然后測試:
通過mvn spring-boot:run 命令啟動,可以看到Jetty已經啟動

![Uploading 907B.tm_314168.png . . .]
如果您使用的gradle,則可以參考官方文檔的做法——https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html

其實可以查看源碼:
查看 EmbeddedServletContainerAutoConfiguration這個類
/**

  • {@link EnableAutoConfiguration Auto-configuration} for an embedded servlet containers.
  • @author Phillip Webb
  • @author Dave Syer
  • @author Ivan Sopov
    */
    @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
    @Configuration
    @ConditionalOnWebApplication
    @Import(BeanPostProcessorsRegistrar.class)
    public class EmbeddedServletContainerAutoConfiguration
    見名知意:link EnableAutoConfiguration Auto-configuration} for an embedded servlet containers.
    找到tomcat和jetty的相應處理代碼:

/**
* Nested configuration if Tomcat is being used.
*/
@Configuration
@ConditionalOnClass({ Servlet.class, Tomcat.class })
@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
public static class EmbeddedTomcat {

    @Bean
    public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
        return new TomcatEmbeddedServletContainerFactory();
    }

}

/**
 * Nested configuration if Jetty is being used.
 */
@Configuration
@ConditionalOnClass({ Servlet.class, Server.class, Loader.class,
        WebAppContext.class })
@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
public static class EmbeddedJetty {

    @Bean
    public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() {
        return new JettyEmbeddedServletContainerFactory();
    }

}

可以看到@ConditionalOnClass({Servlet.class,Server.class, Loader.class,WebAppContext.class})
這樣的條件匹配注解,如果在Jetty或者tomcat的Jar包中可以找到上述三個類的實例,則決定使用jetty容器。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容