当前位置: 首页 > news >正文

Spring AOP

 Java - Spring AOP 拦截器的基本实现

 

什么是 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类继承于HandlerInterceptorAdaptertestInterceptor.jpg

具体代码:

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); } }
  • 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>

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

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

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

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

转载于:https://www.cnblogs.com/SuoChaoFighting/p/5854820.html

相关文章:

  • 《深入浅出 Java Concurrency》—锁机制(九) 读写锁 (ReentrantReadWriteLock) (2)
  • 《深入浅出 Java Concurrency》—锁机制(十) 锁的一些其它问题
  • Unix高级编程之文件IO
  • java集合框架学习—ArrayList的实现原理
  • 不等式证明
  • java集合框架学习—HashMap的实现原理
  • PHP 错误 系列:编码格式错误解决
  • java集合框架学习—HashSet的实现原理
  • 【腾讯优测干货分享】Android内存泄漏的简单检查与分析方法
  • java集合框架学习—LinkedHashMap的实现原理
  • C#基础-MD5验证
  • java中Hashtable与HashMap的区别
  • html5使用FileReader上传图片
  • java中hashcode()和equals()的详解
  • ADO.NET完整增删改
  • “大数据应用场景”之隔壁老王(连载四)
  • 【知识碎片】第三方登录弹窗效果
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • HomeBrew常规使用教程
  • JAVA多线程机制解析-volatilesynchronized
  • js作用域和this的理解
  • PHP的类修饰符与访问修饰符
  • spark本地环境的搭建到运行第一个spark程序
  • SpingCloudBus整合RabbitMQ
  • vue:响应原理
  • Windows Containers 大冒险: 容器网络
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 配置 PM2 实现代码自动发布
  • 如何实现 font-size 的响应式
  • 数据可视化之 Sankey 桑基图的实现
  • 微服务核心架构梳理
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • NLPIR智能语义技术让大数据挖掘更简单
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 数据可视化之下发图实践
  • #1015 : KMP算法
  • #pragma once
  • (C++17) std算法之执行策略 execution
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (规划)24届春招和25届暑假实习路线准备规划
  • (九)c52学习之旅-定时器
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四)linux文件内容查看
  • (四)图像的%2线性拉伸
  • .“空心村”成因分析及解决对策122344
  • .NET Core WebAPI中封装Swagger配置
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 的程序集加载上下文
  • .NET上SQLite的连接
  • .net专家(张羿专栏)
  • /proc/interrupts 和 /proc/stat 查看中断的情况