spring boot 原生组件、定制化组件

一、原生组件的支持 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的时候,就会导致自动配置失效

猜你喜欢

转载自blog.csdn.net/liming0025/article/details/120894337