springboot学习----7.嵌入式servlet容器

嵌入式Servlet容器:

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可以向容器中添加以下组件:

  • ServletRegistrationBean
  • FilterRegistrationBean
  • ServletListenerRegistrationBean

    /**
     * 注册自己的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的应用就启动起来了

你可能感兴趣的:(springboot)