一个程序猿在梦中解决的 Bug

没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感。不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过。

什么是 AOP ?

AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容,是函数式编程的一种衍生范型。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

以上内容引用自百度百科

翻译为人能听懂的话来说就是: AOP 可以理解为在方法执行前后可以去完成相同的业务逻辑,而不需要你去改业务代码。举个例子吧:现在有一个需求,要在项目中的每一个方法前面都输出一句:开始执行啦! 需求很明确了,常规的解决方式就是在每个具体的方法最前面加一句system.out.print("开始执行啦!");,冒出这个想法的程序员是普通程序猿,当然,这是开个玩笑啦!这样的代码,如果一两个方法用这样的方式没有任何问题完全可行,如果几十个、几百个这样的方法呢?
这时候,我们就可以使用 AOP 来完成以上逻辑了,不需要改动任何一个方法,无侵入的方式来完成这个需求。

AOP 在实际项目中运用的场景主要有权限管理(Authority Management)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging)等。就是这些与业务逻辑不是很关联密切的公共方法,我们就可以使用AOP。

Spring AOP 和 MVC 拦截器 又是什么?

通过上面的解释,我是知道了,AOP 其实就是可以算一种设计模式,或者说一种编程思想,而 Spring AOP 就是 Spring框架 对 AOP 这种思想进行了一系列技术实现和封装,让我们只需要配置一下就可以达到这个模式,在配置文件中使用<aop:config>元素。那MVC 拦截器又是什么鬼呢?可以理解为是 Spring MVC 框架对 AOP 的一种实现方式,在配置文件中使用<mvc:interceptors>元素进行配置。这两种方式就是实现了 AOP 的编程思想,我们只需要进行一定的配置就可以了。现在好多人也都把 Spring AOP 和 MVC 拦截器看成是一种相同的方式,都叫拦截器或AOP。

开始撸一下代码

1.新建一个TestInterceptor类继承于HandlerInterceptorAdapter

具体代码:

  1. package cn.mayongfa.interceptor;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import org.springframework.web.servlet.ModelAndView;
  5. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  6. public class TestInterceptor extends HandlerInterceptorAdapter {
  7. @Override
  8. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  9. // 请求处理完成之后
  10. System.out.println("请求处理完成啦!");
  11. super.afterCompletion(request, response, handler, ex);
  12. }
  13. @Override
  14. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  15. // 处理器执行完毕之后
  16. System.out.println("处理器执行完毕啦!");
  17. super.postHandle(request, response, handler, modelAndView);
  18. }
  19. @Override
  20. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  21. // 处理器实际执行之前
  22. System.out.println("处理器执行之前!");
  23. return super.preHandle(request, response, handler);
  24. }
  25. }
  • preHandle(..):它在处理器实际执行 之前 会被执行;
  • postHandle(..),它在处理器执行 完毕 以后被执行;
  • afterCompletion(..),它在 整个请求处理完成 之后被执行。
    这三个方法为各种类型的前处理和后处理需求提供了足够的灵活性。

2.配置一下/WebContent/WEB-INF/springMVC-servlet.xml中的<mvc:interceptors>元素就可以拦截请求了。

  1. <mvc:interceptors>
  2. <!-- 直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
  3. <mvc:interceptor>
  4. <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
  5. <mvc:mapping path="/api/**"/>
  6. <bean class="cn.mayongfa.interceptor.TestInterceptor">
  7. </bean>
  8. </mvc:interceptor>
  9. </mvc:interceptors>

当然,你可以根据你的需求进行拦截,我这里拦截的是api路径下面的所有请求。

3.测试一下
我的项目中有个 /api/user/getlist 请求,在浏览器输入试一下。

看到我们在TestInterceptor类中输出已经打印出来。到这里,你应该明白了如何使用 AOP 来进行一些与业务逻辑无关且必须在代码前后执行的一些通用方法了,这就是我理解 AOP 的作用吧。

Spring学习总结(15)——Spring AOP 拦截器的基本实现相关推荐

  1. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  2. Spring Boot实战:过滤器、拦截器与切片

    Spring Boot实战:过滤器.拦截器与切片 Q:使用过滤器.拦截器与切片实现每个请求耗时的统计,并比较三者的区别与联系 过滤器Filter 过滤器概念 Filter是J2E中来的,可以看做是Se ...

  3. Spring异步调用原理及SpringAop拦截器链原理

    一.Spring异步调用底层原理 开启异步调用只需一个注解@EnableAsync @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTI ...

  4. Spring Boot(5) web开发(3)拦截器、文件上传、异常处理

    Spring Boot(5) web开发(3)拦截器.文件上传.异常处理 学习视频: https://www.bilibili.com/video/BV19K4y1L7MT?p=49&spm_ ...

  5. JavaEE——Spring学习笔记03【AOP开发】

    JavaEE--Spring学习笔记01[Ioc开发的模式] JavaEE--Spring学习笔记02[Spring和Mybatis的整合] JavaEE--Spring学习笔记03[AOP开发] J ...

  6. SpringBoot AOP拦截器

    在Spring里面还提供有一种AOP拦截器配置,不过大部分的AOP拦截器都是围绕着业务层进行拦截处理的.1.建立一个普通的业务操作接口和它的子类:package com.microboot.servi ...

  7. Spring 学习日记 (四) Spring 整合Mybaits 和 struts2 框架的配置文件

    其实也是挺无奈的  这东西永远这一棒子那一锤子的  太不系统了 哎 没办法 跟着项目走吧 首先准备的JAR包 需要配置的几个配置文件 配置spring applicationContext.xml   ...

  8. aop区别 decorator_Decorator或Proxy模式;AOP拦截器

    总结如下:过滤器实现方式在不保证功能前提下,从性能角度考虑有如下先后顺序:Decorator或Proxy模式:AOP拦截器. 考虑使用AOP拦截器时,最好选择那些受众面积比较广的功能,例如一些基础通用 ...

  9. 运用Unity实现AOP拦截器[结合异常记录实例]

    运用Unity实现AOP拦截器[结合异常记录实例] 参考文章: (1)运用Unity实现AOP拦截器[结合异常记录实例] (2)https://www.cnblogs.com/wujy/p/33233 ...

最新文章

  1. 在windows程序中嵌入Lua脚本引擎--编写自己的Lua库
  2. Map集合HashMap TreeMap的输出方法
  3. 前端学习(1267):axios的post传参
  4. MachineLearning(3)-流型
  5. mysql5.5分别把这两个数据库同步到不同的从服务器
  6. Hibernate 双向一对多映射
  7. 步进电机驱动器怎么设置细分
  8. 有原则有要求,B站董事长陈睿打造超好的社区环境
  9. 解决securecrt 登录后方向键,backspace,delete键为乱码
  10. ubuntu 键盘delete删除文件失效
  11. C | 运算符、表达式和语句
  12. 仿bilibili微信小程序2
  13. Android-smart-image-view加载网络图片
  14. win配置pm2开机自启node项目
  15. HBulider X js内存溢出
  16. java基础项目案例:吃货联盟订餐系统
  17. 更稳定的手势识别方法-基于手部骨架与关键点检测
  18. 广州航海学院转计算机,这4所高校从学院变更为大学,校名瞬间变得高大上,在校生赚了...
  19. 第3.7章:StarRocks数据导入--Broker Load
  20. 修改了DNS服务器网速慢,如何修改DNS让网速快到飞起!教你两招让电视、盒子告别卡顿...

热门文章

  1. 123. 买卖股票的zui佳时机 III(JavaScript)
  2. 神经网络 权重文件 大小_神经网络中如何处理过拟合的问题
  3. mysql管理数据_MySQL 管理
  4. g++是什么_飞度车主开奔驰G级的一天,会是什么样的体验?
  5. Linux中zsh插件,ubuntu / zsh shell / oh-my-zsh / 常用插件
  6. layui 如何动态加载局部页面_从输入URL到页面加载的过程?如何由一道题完善自己的前端知识体系!
  7. java web环境_java web
  8. matlab 模糊pid mimo 对应,双关节机械手的模糊PID控制系统设计.doc
  9. oracle 对象的审计,初识!聊聊ORACLE的审计功能
  10. C语言如何设计随机数