• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > 详解Spring AOP 拦截器的基本实现

详解Spring AOP 拦截器的基本实现

作者:Mafly 字体:[增加 减小] 来源:互联网 时间:2017-05-28

Mafly 通过本文主要向大家介绍了spring aop详解,spring aop配置详解,spring aop原理详解,spring aop拦截,spring aop拦截器等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一个程序猿在梦中解决的 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。

具体代码:

package cn.mayongfa.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class TestInterceptor extends HandlerInterceptorAdapter {
  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
      // 请求处理完成之后
      System.out.println("请求处理完成啦!");
      super.afterCompletion(request, response, handler, ex);
  }

  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
      // 处理器执行完毕之后
      System.out.println("处理器执行完毕啦!");
      super.postHandle(request, response, handler, modelAndView);
  }

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      // 处理器实际执行之前
      System.out.println("处理器执行之前!");
      return super.preHandle(request, response, handler);
  }
}
</div>
  • preHandle(..):它在处理器实际执行 之前 会被执行;
  • postHandle(..),它在处理器执行 完毕 以后被执行;
  • afterCompletion(..),它在 整个请求处理完成 之后被执行。

这三个方法为各种类型的前处理和后处理需求提供了足够的灵活性。

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

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

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

3.测试一下

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

请求数据成功,看一下控制台输出:

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

下载地址:SpringDemo_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解spring中使用Elasticsearch的代码实现
  • 详解Spring boot上配置与使用mybatis plus
  • 详解Spring Boot 定时任务的实现方法
  • 详解在Spring Boot中使用数据库事务
  • Spring依赖注入的两种方式(根据实例详解)
  • 详解Spring Boot中使用AOP统一处理Web请求日志
  • 详解Spring Boot集成MyBatis(注解方式)
  • 详解如何用spring Restdocs创建API文档
  • 详解Spring简单容器中的Bean基本加载过程
  • 详解spring boot配置 ssl

相关文章

  • 2017-05-28Spring Boot(五)之跨域、自定义查询及分页
  • 2017-05-28Java微信公众平台开发(11) 微信三大平台的关联
  • 2017-05-28Java 存储模型和共享对象详解
  • 2017-05-28java并发容器CopyOnWriteArrayList实现原理及源码分析
  • 2017-05-28浅析Java 数据结构常用接口与类
  • 2017-05-28java 使用异常的好处总结
  • 2017-08-27Hibernate
  • 2017-05-28详解Mybatis的二级缓存配置
  • 2017-05-28Java实现分页的前台页面和后台代码
  • 2017-05-28Java通过wait()和notifyAll()方法实现线程间通信

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 命令提示符编译java的方法(必看篇)
    • Java Map 在put值时value值不被覆盖的解决办法
    • SpringBoot拦截器实现对404和500等错误的拦截
    • java文件操作之Path,Paths,Files
    • 浅谈TreeSet中的两种排序方式
    • 深入学习Java之PriorityQueue
    • Java中static的特点
    • spring boot拦截器实现IP黑名单实例代码
    • Spring Boot启动过程完全解析(二)
    • Spring Boot中Redis数据库的使用实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有