美文网首页源码
spring 入门之spring boot 分析

spring 入门之spring boot 分析

作者: holly_wang_王小飞 | 来源:发表于2016-08-25 14:59 被阅读294次

    接着新浪博客写 上一篇 说到了 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容器。

    相关文章

      本文标题:spring 入门之spring boot 分析

      本文链接:https://www.haomeiwen.com/subject/ctkasttx.html