一、原生组件的支持 Servlet、Filter、Listener
1、使用Servlet API
- 指定 @ServletComponentScan 制定需要扫描的Servlet包
- 使用@WebServlet注解, 没有经过Spring拦截器
- 使用@WebFilter、@WebListener 注册其他两个组件
2、也可以使用注册Bean
- 使用proxyBeanMethod = true,这样能保证在容器中组件始终格式单实例的
- DispatchServlet 注册流程
- 给容器注册 public DispatcherServlet dispatcherServlet(WebMvcProperties webMvcProperties)
- 通过 DispatcherServletRegistrationBean 把 DispatcherServlet 注册到容器中
- 默认映射的就是 / 路径
- 因为Servlet处理原则就是精确有限原则,所以原生Servlet优先于DispatcherServlet
二、嵌入式Servlet容器
应用中自带容器,也就是内嵌的Tomcat。
原理:
- spring boot 启动的时候,发现现在是web应用,web场景导入tomcat
- web应用会创建一个web容器,ServletWebServerApplicationContext
- ServletWebServerApplicationContext 会在启动的时候,寻找ServletWebServerFactory
- Spring boot 默认有很多默认工厂 tomcat、jetty、UnderTow等,使用默认配置类ServletWebServerFactoryAutoConfiguration
- 所以spring boot 启动的时候,根据动态判断,系统中导入哪个web服务器的包,就会添加哪个容器
切换web容器,在web中移除tomcat,导入期望导入的starter:
可以修改配置文件,来达到配置容器相关属性的目的,自动配置类如下:
属性的绑定:(spring boot 中xxxCustomizer就是定制化器,可以修改默认配置)
三、定制化原理
1、原理分析
导入场景starter - xxxAutoConfiguration - 导入xxx组件 - 绑定xxxProperties
- 绑定配置文件项,所以修改配置文件即可。
2、定制化常见方式
- @Bean替换容器中的默认组件、试图解析器,编写自定义配置类,xxxConfiguration
- 修改配置文件
- xxxCustomizer
- web应用,实现WebMvcConfigurer,即定制化web功能
- 使用@EnableWebMvc,部分的mvc的默认配置都不能使用,需要注意
原理:
- @EnableWebMvc会导入@Import(DelegatingWebMvcConfiguration.class)
- DelegatingWebMvcConfiguration 继承了 WebMvcConfigurationSupport
- 而WebMvcAutoConfiguration在加载的时候,会判断系统中是否存在WebMvcConfigurationSupport
- 所以当使用者自己在容器中使用@EnableWebMvc的时候,就会导致自动配置失效