SpringBoot默认使用的是嵌入式的Tomcat容器
问题:
1.如何定制和修改Servlet容器的相关配置
- 可以在application.properties中进行配置
- 编写一个EmbeddedServletContainerCustomizer:嵌入式servlet容器定制器,来修改servlet容器的配置
- 很可惜的是他过时了,新版springboot2.xx用
@Component
public class MyServletCustomerize implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
@Override
public void customize(TomcatServletWebServerFactory factory) {
factory.setPort(8088);
}
}
在springboot中配置自己的Servlet,Filter,Listener可以向容器中添加以下组件:
/**
* 注册自己的Servlet
*/
@Bean
public ServletRegistrationBean servletRegistrationBean(){
return new ServletRegistrationBean(new MyServlet(),"/MyServlet");
}
/**
* 注册自己的Filter
*/
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new MyFilter());
filterRegistrationBean.setUrlPatterns(Arrays.asList("/MyServlet"));
return filterRegistrationBean;
}
/**
* 注册自己的Listener
*/
@Bean
public ServletListenerRegistrationBean servletListenerRegistrationBean(){
return new ServletListenerRegistrationBean(new MyListener());
}
2.SpringBoot能不能支持其他的Servlet容器
SpringMVC的前端控制器默认拦截所有请求(/),除了jsp页面
可以通过server.servletPath来修改默认拦截的路径
SpringBoot也支持其他Servlet容器:
Jetty(长连接)和Undertow(高并发,不支持jsp)
切换为其他容器只需要排除掉spring-boot-starter-tomcat依赖
再倒入spring-boot-starter-jetty/underTow
新版springboot的嵌入式servlet工厂配置在ServletWebServerFactoryConfiguration
三个嵌入式servlet容器的工厂都是ServletWebServerFactory的子类
嵌入式Servlet容器特点:简单,便携
缺点:默认不支持jsp,优化定制复杂(使用定制器),或者自己编写嵌入式Servlet的创建工厂
外置Servlet容器:外面安装tomcat容器,打成war包运行
必须创建一个springboot的war项目,手动建文件夹=。=
pom.xml文件中
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
作用域必须指定为provided
必须有一个SpringBootServletInitializer的子类,传入springboot的主程序
然后就可以启动了
原理:
jar包:执行SpringBoot主类的main方法,启动ioc容器,创建嵌入式的Servlet容器
war包:先启动服务器,服务器启动springboot应用(SpringBootServletInitializer),启动ioc容器
servlet3.0规范:
服务器启动(web应用启动)会创建当前web应用里面每一个jar包里面的ServletContainerInitializer实例
ServletContainerInitializer的实现放在jar包的META-INF/services文件夹下,有一个名为
javax.servlet.ServletContainerInitializer的文件,内容就是ServletContainerInitializer的全类名
还可以使用@HandlesTypes,在应用启动时加载我们感兴趣的类.
1.启动Tomcat
2.SpringServletContainerInitializer将@HandlesTypes标注的所有类都传入到onstartup方法的Set集合中
为这些类创建对象(除了接口),.newInstance()
3.每一个WebApplicationInitializer调用自己的
for (WebApplicationInitializer initializer : initializers) {
initializer.onStartup(servletContext);
}
相当于我们的SpringBootInitializer会被创建对象,并调用onstartup方法
4.而执行onstartup方法时会创建一个容器
WebApplicationContext rootAppContext = createRootApplicationContext(servletContext);
覆写了configure方法,builder=configure(builder);
return run(application);
5 .Spring的应用就启动起来了