必须加上两个注解

自定义自己Servlet
image.png
必须加上 ServletComponentScan注解:打开springboot的Servlet组件支持,而且还可以定义扫描哪些包(这些包里的Servlet都会被扫描到)
image.png

Servlet

image.png
访问 /my的时候,不会被拦截器拦截到。(为什么?)

Filter

image.png
urlPatterns是指定对哪些路径请求进行过滤,如果不设置的话,默认过滤 “/“
这里是过滤所有/css和/images路径,那么所有一切访问这些路径的请求都会被过滤
比如下面是仅仅访问localhost:8080,就出现了这么多
image.png

监听器

image.png
每次项目启动和销毁的时候,都会被监听到
image.png

原生组件注入的第二种方式:RegistrationBean

image.png
关注一下MyFilter:共有两种注册方式
第一种:
这里传入的第二个参数是 :ServletRegistrationBean类型的
这里传入的是myServlet,那么这个过滤器只过滤这个Servlet的mapping,其他的不过滤
比如访问/my,/my02过滤, 访问 /my04不过滤

第二种:
直接设置urlPattern

注意:这里的@Configuration的属性proxyBeanMethods,默认为true,即单实例。也可以设置成false。但是如果设置成false,那么myFilter或myServlet每次被使用的时候,都会被重新new ,虽然设置的过滤路径和访问路径等依旧起作用,但是会莫名其妙多创建了很多新的对象。造成浪费

借这个原理来看下DispatcherServlet的注入原理

image.pngimage.png
这个dispatcherServlet()作用是往容器里添加dispatcherServlet(名字也是这个)组件,并且把他和WebMvcProperties绑定起来。
WebMvcProperties类可以通过配置文件来配置。配置前缀是 spring.mvc
image.png

image.png
这个方法,有参数DispatcherServlet,还标注了@Bean,那么就先判断容器里是否有这个组件,如果有,直接从容器里拿出来注入这里。
这个方法作用:创建 DispatcherServletRegistrationBean(这就和前面的ServletRegistrationBean联系起来了),传入参数servlet和urlMapping,这里的urlMapping就是WebMVCProperties里的path的值。(即 “/”),这个值可以在配置文件中修改
image.png

那么如果我们再设置一个MyServlet,路径是 /my。浏览器访问/my,这时候tomcat就会根据精准优先原则,在dispatcherServlet的/和我们的/my之中选择/my

嵌入容器,这个应用场景不多,不细做笔记。遇到的时候再去看视频吧。

定制化

1.常规使用(非定制化):
场景starter **- xxxxAutoConfiguration - 导入xxx组件 - 绑定xxxProperties — 绑定配置文件项

2.定制化
常用的定制化方式

  • 修改配置文件;
  • xxxxxCustomizer;
  • 编写自定义的配置类 xxxConfiguration;+ @Bean替换、增加容器中默认组件;视图解析器
  • Web应用 编写一个配置类实现 WebMvcConfigurer 即可定制化web功能;+ @Bean给容器中再扩展一些组件

    1. @Configuration
    2. public class AdminWebConfig implements WebMvcConfigurer
  • @EnableWebMvc + WebMvcConfigurer —— @Bean 可以全面接管SpringMVC,所有规则全部自己重新配置; 实现定制和扩展功能

    • 原理
    • 1、WebMvcAutoConfiguration 默认的SpringMVC的自动配置功能类。静态资源、欢迎页…..
    • 2、一旦使用 @EnableWebMvc 、。会 @Import(DelegatingWebMvcConfiguration.class)
    • 3、DelegatingWebMvcConfiguration 的 作用,只保证SpringMVC最基本的使用
      • 把所有系统中的 WebMvcConfigurer 拿过来。所有功能的定制都是这些 WebMvcConfigurer 合起来一起生效
      • 自动配置了一些非常底层的组件。RequestMappingHandlerMapping、这些组件依赖的组件都是从容器中获取
      • public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport
    • 4、WebMvcAutoConfiguration 里面的配置要能生效 必须 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
    • 5、@EnableWebMvc 导致了 WebMvcAutoConfiguration 没有生效。
  • … …

分开来讲:

1.修改配置文件
直接在配置文件中修改相关属性即可实现简单定制化

2.编写自定义的配置类 xxxConfiguration + @Bean,实现替换、增加容器中默认组件;
另外,实现某个类,然后用@Component把这个类加到容器里本质上也是这种原理。(和@Bean一样)
比如增加视图解析器、替换restful风格、增加WebMvcConfiguration里的组件等
image.pngimage.pngimage.png

3.第三种:Web应用 编写一个配置类实现 WebMvcConfigurer 即可定制化web功能;+ @Bean给容器中再扩展一些组件。这个和上面那种很像,甚至可以看成同一个原理
image.png
**
4.第四种,很厉害了。全面接管
比如给上面的WebConfig,如果这时候加上@EnableWebMvc,就是全面接管
image.png

全面接管之后,springboot的各种默认配置(比如静态资源配置,错误页配置、欢迎页)就不能用了,必须手动在我们的接管类里添加。
比如上面接管了之后,去访问静态资源,会发现404,想要访问的话,需要手动加上静态资源配置。