SpringBoot使⽤过滤器、、切⾯(AOP),及其之间的区别和执
⾏顺序
先上代码,下⾯的demo中包含多个、过滤器,以及切⾯的前置通知/后置通知/环绕通知:
下⾯总结⼀下相关原理:
⾸先了解⼀下SpringMVC的执⾏流程
具体流程如下
1. ⽤户发起请求到前端控制器(Controller)
2. 前端控制器没有处理业务逻辑的能⼒,需要到具体的模型对象处理(Handler),到处理器映射器(HandlerMapping)中查Handler对象(Model)。
3. HandlerMapping返回执⾏链,包含了2部分内容:① Handler对象、②数组
4. 前端处理器通过处理器适配器包装后执⾏Handler对象。
5. 处理业务逻辑。
6. Handler处理完业务逻辑,返回ModelAndView对象,其中view是视图名称,不是真正的视图对象。
7. 将ModelAndView返回给前端控制器。
8. 视图解析器(ViewResolver)返回真正的视图对象(View)。
9. (此时前端控制器中既有视图⼜有Model对象数据)前端控制器根据模型数据和视图对象,进⾏视图渲染。
10. 返回渲染后的视图(html/json/xml)返回。
11. 给⽤户产⽣响应。
核⼼就是DispatcherServlet核⼼控制器,我们看源码可知道DispatcherServlet是Servlet的⼦类
下⾯⽤⼀张图说⼀下过滤器、Servlet容器、、AOP、Controller之间的关系
然后具体执⾏流程如下:
和过滤器的区别
1、不依赖与servlet容器是SpringMVC⾃带的,过滤器依赖于Servlet容器。
2、是基于java的反射机制的,⽽过滤器是基于函数回调。
3、只能对action请求起作⽤,⽽过滤器则可以对⼏乎所有的请求起作⽤。
4、可以访问controller上下⽂、值栈⾥的对象,⽽过滤器不能访问。
(的preHandle⽅法在进⼊controller前执⾏,⽽的postHandle⽅法在执⾏完controller业务流程后,在视图解析器解析ModelAndView之前执⾏,可以操控Controller的ModelAndView内容。⽽afterCompletion是在视图解析器解析渲染ModelAndView完成之后执⾏的)
( 过滤器是在服务器启动时就会创建的,只会创建⼀个实例,常驻内存,也就是说服务器⼀启动就会执⾏Filter的init(FilterConfig config)⽅法.当Filter被移除或服务器正常关闭时,会执⾏destroy⽅法)
5、可以获取IOC容器中的各个bean,⽽过滤器就不⾏,这点很重要,在⾥注⼊⼀个service,可以调⽤业务逻辑。
(关于这句话的解读是:我们知道是SprinMVC⾃带的,⽽SpringMVC存在Controller层的,⽽controller层可以访问到service层,service层是不能访问service层的,⽽过滤器是客户端和服务端之间请求与响应的过滤)
spring mvc和boot区别
6、过滤器和触发时机、时间、地⽅不⼀样
(过滤器是在请求进⼊容器后,但请求进⼊servlet之前进⾏预处理的。请求结束返回也是在servlet处理完后,返回给前端之前,如果看不懂可以看7完后再来理解)
7、过滤器包裹住servlet,servlet包裹住。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。