详解SpringBoot AOP 拦截器(Aspect注解方式)

 更新时间:2017年05月13日 16:16:04   作者:catoop  
这篇文章主要介绍了详解SpringBoot AOP 拦截器 Aspect,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

常用用于实现拦截的有:Filter、HandlerInterceptor、MethodInterceptor

第一种Filter属于Servlet提供的,后两者是spring提供的,HandlerInterceptor属于Spring MVC项目提供的,用来拦截请求,在MethodInterceptor之前执行。

实现一个HandlerInterceptor可以实现接口HandlerInterceptor,也可以继承HandlerInterceptorAdapter类,两种方法一样。这个不在本文范围,具体使用之前已经写过SpringBoot的(SpringMVC的使用一样,区别只是配置)

MethodInterceptor是AOP项目中的拦截器,它拦截的目标是方法,即使不是Controller中的方法。

实现MethodInterceptor拦截器大致也分为两种,一种是实现MethodInterceptor接口,另一种利用Aspect的注解或配置。

关于实现MethodInterceptor接口的这种方法,还需要在配置文件中做配置,在SpringMVC中使用还可以,在SpringBoot中使用起来似乎没有那么方便。

本文主要还是说Aspect注解方式,个人觉得这种方法才比较灵活,与配置与工程整个代码都没有耦合(你添加一个类,做几个注解就可以用了,无需在其他地方再做什么),更易应用。

首先为你的SpringBoot项目添加maven依赖,让其支持aop(其实就是自动引入aop需要的一些jar)

在pom.xml中添加依赖:

 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
 </dependency>

然后创建Aspect测试类:

package com.shanhy.sboot.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Aspect // FOR AOP
@Order(-99) // 控制多个Aspect的执行顺序,越小越先执行
@Component
public class TestAspect {

 @Before("@annotation(test)")// 拦截被TestAnnotation注解的方法;如果你需要拦截指定package指定规则名称的方法,可以使用表达式execution(...),具体百度一下资料一大堆
 public void beforeTest(JoinPoint point, TestAnnotation test) throws Throwable {
  System.out.println("beforeTest:" + test.name());
 }

 @After("@annotation(test)")
 public void afterTest(JoinPoint point, TestAnnotation test) {
  System.out.println("afterTest:" + test.name());
 }

}

这样就完成了,然后创建一个Controller验证一下:

@RestController
@RequestMapping("/test")
public class TestController {

 @TestAnnotation(name="abc")
 @RequestMapping("/show")
 public String show() {
  return "OK";
 }

 @RequestMapping("/show2")
 public String show2() {
  return "OK2";
 }
}

此时我们访问show请求,就会被拦截,控制台会打印输出。如果请求show2则不会被拦截。

注意:

1、在application.properties中也不需要添加spring.aop.auto=true,因为这个默认就是true,值为true就是启用@EnableAspectJAutoProxy注解了。

2、你不需要手工添加 @EnableAspectJAutoProxy 注解。

3、当你需要使用CGLIB来实现AOP的时候,需要配置spring.aop.proxy-target-class=true,这个默认值是false,不然默认使用的是标准Java的实现。

其实aspectj的拦截器会被解析成AOP中的advice,最终被适配成MethodInterceptor,这些都是Spring自动完成的,如果你有兴趣,详细的过程请参考springAOP的实现。

关于集中拦截方法的区别总结:

HandlerInterceptoer拦截的是请求地址,所以针对请求地址做一些验证、预处理等操作比较合适。当你需要统计请求的响应时间时MethodInterceptor将不太容易做到,因为它可能跨越很多方法或者只涉及到已经定义好的方法中一部分代码。

MethodInterceptor利用的是AOP的实现机制,在本文中只说明了使用方式,关于原理和机制方面介绍的比较少,因为要说清楚这些需要讲出AOP的相当一部分内容。在对一些普通的方法上的拦截HandlerInterceptoer就无能为力了,这时候只能利用AOP的MethodInterceptor。

Filter是Servlet规范规定的,不属于spring框架,也是用于请求的拦截。但是它适合更粗粒度的拦截,在请求前后做一些编解码处理、日志记录等。

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

相关文章

  • Java详细介绍单例模式的应用

    Java详细介绍单例模式的应用

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
    2022-09-09
  • 详解MyBatis的XML实现方法(附带注解方式实现)

    详解MyBatis的XML实现方法(附带注解方式实现)

    这篇文章主要详细介绍了MyBatis的XML实现方法(附带注解方式实现),文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-05-05
  • Spring Boot中Bean定义方调用方式解析

    Spring Boot中Bean定义方调用方式解析

    这篇文章主要介绍了Spring Boot中Bean定义方调用方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java spring的三种注入方式详解流程

    Java spring的三种注入方式详解流程

    Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率
    2021-10-10
  • 如何在IDEA中查看依赖关系的方法步骤

    如何在IDEA中查看依赖关系的方法步骤

    这篇文章主要介绍了如何在IDEA中查看依赖关系的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • SpringBoot集成SwaggerUi以及启动时遇到的错误

    SpringBoot集成SwaggerUi以及启动时遇到的错误

    这篇文章主要介绍了SpringBoot集成SwaggerUi以及启动时遇到的错误,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Spring MVC中@Controller和@RequestMapping注解使用

    Spring MVC中@Controller和@RequestMapping注解使用

    这篇文章主要介绍了Spring MVC中@Controller和@RequestMapping注解使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 使用Java生成JWT令牌的示例代码

    使用Java生成JWT令牌的示例代码

    json-web-token简称java web令牌,也称作JWT,是一种可以实现跨域身份验证身份的方案,jwt不加密传输数据,但能够通过数据前面验证数据的未被篡改,本文给大家介绍了如何使用Java生成JWT令牌,需要的朋友可以参考下
    2024-04-04
  • Spring注解之@Import使用方法讲解

    Spring注解之@Import使用方法讲解

    @Import是Spring基于Java注解配置的主要组成部分,下面这篇文章主要给大家介绍了关于Spring注解之@Import的简单介绍,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Java实现堆算法的使用示例

    Java实现堆算法的使用示例

    本文主要介绍了Java实现堆算法的使用示例,Java中提供了一个Heap类,可以用来实现堆的操作,可以实现如插入、删除、获取最大最小值等,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12

最新评论