上一节走了一遍从浏览器发出请求到得到向页面的流程,基本的功能是已经实现了。但是现在啊,我想自定义一个拦截器(拦截器可以做用户登录验证,如果登录了,就让你通过,如果没有登录,就重定向登录页面),这里就不复杂了,简单实现以下原理,除了不拦截“/hello”请求,其他请求我都拦截并跳转到index.html。

1.了解springboot的配置类格式

  springboot的配置类最常见的就是在类上面标注@Configuration,表示这是一个配置类(就是以前的xml);

  第一种:在配置类的里面就有很多的@Bean标注的方法(就是以前的<bean id="" class=""></bean>),方法名是id,方法返回值是class;

  第一种扩充:标注了@Bean的方法里面返回值匿名内部类的形式

  第二种:在配置类里面还写个静态内部类,静态内部类里面也有@Bean以及一些重写的方法。

  第三种:配置类继承某个类,重写了父类方法

  只要是想添加组件,你自定义的@Bean,可以放在任意的配置类中(标了@Configuration注解,或者写在有main方法的主配置类中)

  配置类用的比较多的就是这几种,还有一些其他的可以自己多查查资料,或者分析一下源码。

  首先这种直接加@Bean的方式就不说了,先说说第三种(这种常用啊),再说说第一种的扩充。第二种就不说了,我们现阶段用不到,不过看springboot自动配置类里面大量用到这种方式,所以这就导致了springboot就那几十个自动配置类,就几乎配置了web应用所有组件。

2. 第三种的方式

  在springboot中,提供了一组接口,xxxConfigurer,这种接口就是让你扩展功能的,比如你想添加一个自定义的视图解析器,就可以实现这个接口,重写configureViewResolvers方法,原理后面会讲到。

  现在以WebMvcConfigurer接口为例,初步认识这个东西。WebMvcConfigurer顾名思义,就是webmvc配置器,可以让你扩充webmvc里面的功能。

  在这里不得不说一下,面向接口和面向抽象类编程的区别了。面向接口变成就是你要实现接口中【所有所有】的方法,管你用不用得上;但是,假如有个抽象类去实现了这个接口(抽象类里面都是空方法,还可以自己添加新的方法),然后我们只需要去继承这个抽象类,重写其中我们需要的方法就可以了,用多少,就重写多少。

  基于这种思想,springboot提供了一个抽象类WebMvcConfigurerAdapter去实现WebMvcConfigurer接口,所以我们只需要继承WebMvcConfigurerAdapter就可以了。

  现在就来自定义一个拦截器,拦截器的原理就不说了,就三个方法,preHandle(调用controller里面方法前首先调用此方法,登录验证主要在这里),postHandle(后),afterCompletion(返回页面之后),springboot定义拦截器(可以实现HandlerInterceptor接口,也可以继承HandlerInterceptorAdapter抽象类,原因跟上面一样),我这里就是继承的方式。

  

  上图下面的是我自己写的逻辑,就是转发到index.html页面,emmmm....我也不知道这个index.html会不会被视图解析器解析,反正写“/index.html”可以,直接写“index”也行,自己尝试一下吧!

  写个继承抽象类WebMvcConfigurerAdapter的配置类

 

 这种很方便吧,而且WebConfigurerAdapter内部方法很多,可以重写的方法很多,自己去尝试啊 。

3.第一种扩充的方式

  随便找个标有@Configuration或者相关的配置类,我就在主配置类配置了。

  

  这样配置也行,这种比上面一种简洁一点,不用特意写一个配置类了。

  看到这里,肯定有很多小伙伴会惊呼,我日了狗哦,为什么这样就会配置到应用中啊?你就实现了一个方法或者把一个xxxconfigurer的匿名类丢到容器(匿名内部类----->继承xxxConfiguratorAdapter-------->实现xxxConfigurer接口),springboot就会找到组件并用起来,这么厉害。

  下面就来粗略看看原理(不用想,还是在自动配置类里面,记住,一切原理都在自动配置类里面)

4.一起看看xxxConfigurer原理(以WebMvcConfigurer为例)

  首先打开自动配置类------->WebMvcAutoConfiguration,找到

  这个类EnableWebMvcConfiguration也是一个本自动配置类的一个静态内部类,下面重写的方法也就是调用父类的一些方法(这里偷个懒,就不带着去看了),所以重点就是父类DelegatingWebMvcConfiguration

  

  

  打开父类可以看到,而且这个此类下面所有重写的方法,就是调用configurers这个容器的方法。

  打开这个容器WebMvcConfigurerComposite,你会发现这里就是遍历所有的configurers,挨个执行每个方法。

  所有的基本逻辑说完了,看到这里肯定蒙比了,前面的都忘记的差不多了,这是正常现象。

  那么,这里就再总结一下前面的原理,回顾一下:

  首先是定义一个继承WebMvcConfigurerAdapter抽象类(WebMvcConfigurer类型)的拦截器,拦截器是一个WebMvcConfigurer类型的------------->实现了addInterceptor(registry)方法添加拦截映射-------------->这个【WebMvcConfigurer】类型的拦截器丢到容器里,供别的组件从容器中获取(springboot大量用这种原理,实现什么功能的组件直接丢到容器中,就不用你操心了)。

  然后启动springboot应用,自动配置类加载-------------->加载EnableWebMvcConfiguration.class内部类-------->这个内部类调用父类【DelegatingWebMvcConfiguration】方法--------->父类DelegatingWebMvcConfiguration功能就是从容器中获取获取所有的WebMvcConfigurer类型的组件,运用一定的方式遍历所有的WebMvcConfigurer,并依次运行所有的方法(包括自定义的addInterceptor方法,以及自定义的其他方法都是在这里运行)------------>等待你在浏览器url输入,判断是否满足拦截条件进行拦截

  这里就是简单的说了一下WebMvcConfigurer的原理,适合萌新入门使用,想要更深入的可以自己去走走源码,会理解的很清楚的。而且,推荐一个学习springboot的学习方式,跟着我的或者别的大佬的教程,源码走一遍,只是看完了一两遍效果不大,吃碗饭的功夫就忘记了(亲测!),要想自己理解,还是需要自己多走走源码,走个五六遍,七八遍,你会拨开云雾见天明.....

带着萌新看springboot源码05的更多相关文章

  1. 带着萌新看springboot源码8(spring ioc源码 完)

    上一节说到实例化了所有的单实例Bean,后面还有一步遍历 12.完成容器刷新(finishRefresh();) 那个和生命周期有关的后置处理器类型是LifecycleProcessor:监听器原理我 ...

  2. 带着萌新看springboot源码8(spring ioc源码上)

    emmm.....这次先不说springboot原理,先好好回顾一下以前的注解版spring原理,先把spring原理了解清晰了,再看springboot原理更容易. 要说起spring,最重要的就是 ...

  3. 带着萌新看springboot源码03

    上一节讲到了快速新建一个springboot应用,以及springboot的自动配置类起作用的时机,并且一起看了一个自动配置类的源码. 这一节我们来粗略看看当用户在浏览器输入一个url,怎么样返回一个 ...

  4. 带着萌新看springboot源码12(启动原理 下)

    先继续接上一篇,那个启动原理还有一点没说完. 6. afterRefresh(context, applicationArguments); 看这个名字就知道,应该就是ioc容器刷新之后的一些操作了, ...

  5. 带着萌新看springboot源码11(springboot启动原理 源码上)

    通过前面这么多讲解,springboot原理应该也大概有个轮廓了,一些基本的配置,从客户端url到controller(配置一些要用的组件,servlet三大组件,处理器映射器,拦截器,视图解析器这些 ...

  6. 带着萌新看springboot源码10(springboot+JdbcTemplate+druid)

    上一节把springboot和jdbcTemplate大概用法说了一下,以及大概看了一下源码,还说了加载sql文件时的原理. 这一节来看看自动注入JdbcTemplate的原理,顺便用一用Druid数 ...

  7. 带着萌新看springboot源码09(springboot+JdbcTemplate)

    emmm.....常规开局,继续说一下废话,前面简单的说了一下spring的ioc容器创建原理(花了不少时间去看了别人的博客+查了不少资料+自己的理解),相信大家对ioc容器有了一个初步的认识了. s ...

  8. 带着萌新看springboot源码04

    继续开头说些废话,我也不知道什么鬼,每次写着写着经常会写到其他地方去了,太容易分神了. 这次说一下springboot对于springmvc的大概整个流程,以请求动态网页为例 . 1.梳理一下spri ...

  9. 带着萌新看springboot源码8(spring ioc源码下)

    继续接着上一节,到了第六步(温馨提醒,内容有点小多,不过看完ioc原理就差不多了) 6.注册Bean后置处理器(registerBeanPostProcessors(beanFactory)) 最后一 ...

随机推荐

  1. net view ERROR 6118

    如上图,使用net view命令出现错误6118(server2012),谷歌百度油管解决了. 尝试1: 把Computer Browser服务打开.https://blog.csdn.net/qq_ ...

  2. 安装VUE Cli3 框架方法

    下面为大家介绍一下怎样安装  VUE Cli3的步骤 官网地址  https://cli.vuejs.org/zh/guide/installation.html 一.首先要检查一下是否安装node环 ...

  3. 学习随笔:Django 补充及常见Web攻击 和 ueditor

    判断用户是否登录 <!-- xxx.html --> {% if request.user.is_authenticated %} django中的request对象详解 填错表格返回上次 ...

  4. centos7部署openstack-ocata

    1.前言 本文旨在记录本人的一个实验过程,因为其中有一些坑,方便以后回顾查询. 其中限于篇幅(大部分是配置部分)有些内容省略掉了,官网都有,各位如果是安装部署的话可以参考官网,不建议使用本文. 以下是 ...

  5. 关闭或启动linux防火墙后,docker启动容器报错

    # docker启动报错   # 解决办法:重建docker0网络恢复   #按照进程名杀死docker进程 [root@localhost mysqlconf]# pkill docker #清空防 ...

  6. C# 显示纯文本对齐封装(控制显示字体长度)

    坑: 用户在写多行的纯文本上来了一个对齐的表格..如下: 原因:不同的字体下,中文,英文大写,英文小写,字符,尤其是空格..字体占用的长度是不一样的,然后显示出来就是乱的.. 然而客户要求在不同的字体 ...

  7. NOIP2012提高组day2 T2借教室

    这题骗分可以骗到满分(可能是数据不太强给强行过去了) 这道题如果是按照题意去模拟用循环去修改区间的话只有45分,正解是二分+差分数组,骗分也是差分数组但是没有使用二分,时间复杂度在最坏的情况下是O(n ...

  8. PHP调用微博接口实现微博登录的方法示例

    在平时项目开发过程中,除了注册本网站账号进行登录之外,还可以调用第三方接口进行登录网站.这里以微博登录为例.微博登录包括身份认证.用户关系以及内容传播.允许用户使用微博帐号登录访问第三方网站,分享内容 ...

  9. java中的异常(二)

    异常的分类 在使用上 Error不用管他虚拟机错误 Exception必须要用catch抓 RuntimeExcption可以处理也可以不用处理 说明 Error:称为错误,由java虚拟机生成并抛出 ...

  10. 机器学习(七)EM算法、GMM

    一.GMM算法 EM算法实在是难以介绍清楚,因此我们用EM算法的一个特例GMM算法作为引入. 1.GMM算法问题描述 GMM模型称为混合高斯分布,顾名思义,它是由几组分别符合不同参数的高斯分布的数据混 ...