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