github地址: https://github.com/985391294/spring-framework-tqz
码云地址: https://gitee.com/tianqingzhao/spring-framework-tqz
在目标类创建出来之后,去解析当前目标类
如果符合规则的话,就把当前切面的通知给配置为一个执行器链,依次是前置通知、后置通知、异常通知、最终返回通知,异常通知和最终返回通知只能共存一个,
spring中海油一个环绕通知,这里省略。。。。。。
13.AOP的具体逻辑如下,通过jdk的动态代理创建出来代理对象,然后让该类实现HandlerInvocation接口,实现invoke方法,当执行目标方法的时候,会调用invoke方法,执行调用链。
通过proceed()方法进入到执行链
14.执行器链依次执行几大通知方法
这里以before通知为例,如果是前置通知就在执行下一个拦截器之前调用,如果是后置通知就在下一个拦截器执行完之后调用,异常通知就在catch代码块里面执行,需要注意的是如果有异常通知,被代理的方法不能捕捉异常,只能向外面抛,因为aop的异常拦截是在有异常的时候才会执行,如果给捕捉了,对于整个调用链来说相当于是没有异常的,最终通知就放在finally代码块里面,不管有没有异常都会执行,
通过这里执行通知方法的调用,至此整个aop完成了。
15.spring的上下文环境初始化完成之后就该完成mvc的三个核心组件注册了,我们只关心HandlerMapping、HandlerAdapter、ViewResovler
16.这里又是从容器中拿到所有的bean,然后判断当前bean有没有添加Contrller注解,如果添加了Controller注解,就去继续解析这个bean,把类上面的url和方法上面的url拼接到一起然后用正则编译一下,然后封装给HandlerMapping,再把这个HandlerMapping放到一个list中
17.HandelrAdapter又是跟HandlerMapping保持一一对应的关系,目的就是处理每个方法里面的参数,做一个参数动态匹配
18.ViewResolver,先去看一下配置文件里面有没有配置模板引擎,如果没有配置就是用默认的templates
19.用户发送请求到前端控制器
20.根据请求的url拿到handlerMapping对象,拿不到就返回404,拿到的话再根据handlerMapping找到对应的hanlderAdapter,然后去处理参数,返回一个ModelAndView对象
21.根据ViewResolver解析当前ModelAndView,返回一个View对象,view对象再去处理当前的model里面的数据以及页面名称,通过response输出到浏览器。
到这里整个spring-frameworke就完成了,不知道有没有忘记介绍什么内容。