首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在异步通知之前或之后访问Spring AOP中的RequestContextHolder

在Spring AOP中,可以通过RequestContextHolder来访问当前请求的上下文信息。RequestContextHolder是Spring框架提供的一个工具类,用于持有当前线程的请求上下文。它提供了获取HttpServletRequest和HttpServletResponse等对象的方法,以便在业务逻辑中使用。

在异步通知之前或之后访问Spring AOP中的RequestContextHolder,可以按照以下步骤进行:

  1. 导入必要的依赖:首先,在项目的依赖管理文件中(如Maven的pom.xml或Gradle的build.gradle)添加Spring AOP的相关依赖,以确保项目中可以使用AOP功能。
  2. 创建切面类:通过创建一个切面类来实现在异步通知之前或之后访问RequestContextHolder的目的。切面类可以使用@Aspect注解进行标记,并且可以定义一个或多个通知(Advice)方法。
  3. 在通知方法中使用RequestContextHolder:在通知方法中,通过RequestContextHolder提供的静态方法获取当前线程的请求上下文。例如,可以使用RequestContextHolder.getRequestAttributes()获取请求属性对象,并通过强制类型转换获取HttpServletRequest对象。

以下是一个示例代码,展示了如何在异步通知之前或之后访问Spring AOP中的RequestContextHolder:

代码语言:txt
复制
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import javax.servlet.http.HttpServletRequest;

@Aspect
@Component
public class MyAspect {

    @Before("@annotation(com.example.MyAnnotation)")
    public void beforeAdvice() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        // 在异步通知之前访问RequestContextHolder,可以使用HttpServletRequest对象执行相关操作
        // ...
    }

    @After("@annotation(com.example.MyAnnotation)")
    public void afterAdvice() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        // 在异步通知之后访问RequestContextHolder,可以使用HttpServletRequest对象执行相关操作
        // ...
    }
}

上述代码中,使用@Aspect注解将MyAspect类标记为一个切面类,然后通过@Before和@After注解定义了两个通知方法,分别在注解为@com.example.MyAnnotation的方法执行之前和之后触发。在这两个通知方法中,通过RequestContextHolder.getRequestAttributes()获取请求属性对象,并进行类型转换获取HttpServletRequest对象,以便进行相关操作。

注意:为了使RequestContextHolder正常工作,需要确保在应用程序中启用了Spring的请求上下文。这可以通过在web.xml中配置DispatcherServlet或通过在Spring Boot应用程序中添加@EnableWebMvc注解来实现。

综上所述,通过使用RequestContextHolder,我们可以在Spring AOP中的异步通知之前或之后访问请求的上下文信息,并执行相关操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring学习】AOP实现日志记录

AOP编程思想就是把很多类对象横切问题点,从业务逻辑中分离出来,减少代码冗余和降低模块间耦合度,提高开发效率。...AOP核心原理 Spring AOP就是基于动态代理,通过JDK动态代理CGLib代理在运行时期在对象初始化阶段织入代码。...AOP主要概念理解 aspect:切面,切面由切点和通知组成,即包括横切逻辑定义也包括连接点定义; pointcut:切点,每个类都拥有多个连接点,可以理解是连接点集合; joinpoint:连接点...,程序执行某个特定位置,某个方法调用前后等; weaving:织入,将增强添加到目标类具体连接点过程; advice:通知,织入到目标类连接点上一段代码,就是增强到什么地方?...AOP五种通知工作 前置通知:在目标方法调用之前执行,可以获得切入点信息; 后置通知:在目标方法执行后执行,目标方法有异常不执行; 异常通知:在目标方法抛出异常时执行,可以获取异常信息; 最终通知:在目标方法执行后执行

67120

Spring Boot 2.X(八):Spring AOP 实现简单日志切面

3.AOP 核心概念 名词 概念 理解 通知(Advice) 拦截到连接点之后所要执行代码,通知分为前置、后置、异常、最终、环绕通知五类 我们要实现功能,日志记录,性能统计,安全控制,事务处理,...异常处理等等,说明什么时候要干什么 连接点(Joint Point) 被拦截到点,如被拦截方法、对类成员访问以及异常处理程序块执行等等,自身还能嵌套其他 Joint Point Spring...)和通知(Advice)定义 切面就是通知和切入点结合 目标对象(Target Object) 切入点选择对象,也就是需要被通知对象;由于 Spring AOP 通过代理模式实现,所以该对象永远是被代理对象...Spring AOP 1.简介 AOPSpring 框架一个核心内容。...Spring AOP 代理由 Spring IOC 容器负责生成和管理,其依赖关系也由 IOC 容器负责管理。

1.5K51
  • SpringBoot AOP 自定义注解异步监听方式实现日志记录(附源码)

    功能简介 本文主要记录如何使用 注解+aop切面+异步监听 方式来实现日志记录功能。...主要流程: AOP切面得到请求数据 -> 发布监听事件 -> 异步监听日志入库 二. 项目结构 ? 三....项目实战 1.引入依赖 org.springframework.boot spring-boot-starter-aop...descrption() default "" ;//描述} 3.AOP切面类 AOP切面类是最主要,可以使用自定义注解针对包名实现AOP增强。...1)这里实现了对自定义注解切点,对使用了自定义注解方法进行AOP切面处理; 2)对方法运行时间进行监控; 3)对方法名,参数名,参数值,对日志描述以及异常信息优化处理; 4)发布监听事件,日志异步入库

    3.1K30

    Spring Boot如何利用AOP巧妙记录操作日志?

    简单回顾SpringAOP相关知识点 SpringAOP相关知识点包括源码解析,我已经在之前文章详细说明,如果对AOP概念还不是特别清晰的话。...织入(Weaving):将切面应用到目标对象并创建代理对象过程,SpringAOP选择再目标对象运行期动态创建代理对 引入(introduction):在不修改代码前提下,引入可以在运行期为类动态地添加方法字段...2、通知五种类型 前置通知Before:目标方法调用之前执行通知。 后置通知After:目标方法完成之后,无论如何都会执行通知。...返回通知AfterReturning:目标方法成功之后调用通知。 异常通知AfterThrowing:目标方法抛出异常之后调用通知。 环绕通知Around:可以看作前面四种通知综合。...4、AOP应用场景 记录日志 监控性能 权限控制 事务管理 快速开始 引入依赖 如果你使用是SpringBoot,那么只需要引入:spring-boot-starter-aop,框架已经将spring-aop

    1.1K10

    微服务用户认证与授权杂谈(下)

    而本文目的主要是延续上文来补充几个要点,例如Token如何在多个微服务间进行传递,以及如何利用AOP实现登录态和权限统一校验。...而本小节主要是介绍使用AOP实现登录状态检查,因为利用AOP同样可以拦截受保护资源访问请求,在对资源访问前先做一些必要检查。 首先需要在项目中添加AOP依赖: <!...Tips: 这里之所以没有使用过滤器拦截器来实现登录态校验,而是采用了AOP,这是因为使用AOP写出来代码比较干净并且可以利用自定义注解实现可插拔效果,例如访问某个资源不用进行登录态检查了,那么只需要把...实现用户权限验证 在第一小节我们介绍了如何使用AOP实现登录态检查,除此之外某些受保护资源可能需要用户拥有特定权限才能够访问,那么我们就得在该资源被访问之前做权限校验。...权限校验功能同样也可以使用过滤器、拦截器AOP来实现,和之前一样本小节采用AOP作为示例。 这里也不做太复杂校验逻辑,主要是判断用户是否是某个角色即可。

    71410

    Java 实战系列·Spring Boot Aspect

    Spring Boot Aspect AOP 是一种与语言无关程序思想、编程范式。项目业务逻辑,将通用模块以水平切割方式进行分离统一处理,常用于日志、权限控制、异常处理等业务。...AOP 注解 @Aspect:切面,这个注解标注在类上表示为一个切面 @Joinpoint:连接点,被 AOP 拦截类或者方法 @Pointcut:切入点,从哪里开始切入 Advice:通知几种类型...@Before:前置通知,在目标方法调用前调用通知功能; @After:后置通知,在目标方法调用之后调用通知功能,不关心方法返回结果; @AfterReturning:返回通知,在目标方法成功执行之后调用通知功能...; @AfterThrowing:异常通知,在目标方法抛出异常后调用通知功能; @Around:环绕通知通知包裹了目标方法,在目标方法调用之前之后执行自定义行为 示例 伪代码表示通知顺序: try...记录接口访问日志 Spring Boot 实战系列 AOP 面向切面编程

    1.5K30

    SpringBoot应用中使用AOP记录接口访问日志

    本文主要讲述AOP在mall项目中应用,通过在controller层建了一个切面来实现接口访问统一日志记录。...AOP相关术语 通知(Advice) 通知描述了切面要完成工作以及何时执行。比如我们日志切面需要记录每个接口调用时长,就需要在接口调用前后分别记录当前时间,再取差值。...前置通知(Before):在目标方法调用前调用通知功能; 后置通知(After):在目标方法调用之后调用通知功能,不关心方法返回结果; 返回通知(AfterReturning):在目标方法成功执行之后调用通知功能...; 异常通知(AfterThrowing):在目标方法抛出异常后调用通知功能; 环绕通知(Around):通知包裹了目标方法,在目标方法调用之前之后执行自定义行为。...Spring中使用注解创建切面 相关注解 @Aspect:用于定义切面 @Before:通知方法会在目标方法调用之前执行 @After:通知方法会在目标方法返回抛出异常后执行 @AfterReturning

    1.7K30

    Spring Boot 使用 AOP 实现 REST 接口简易灵活安全认证

    其实上述简易安全认证功能实现过程主要利用了SpringAOP特性。 下面再简单介绍下AOP常见概念(主要参考Spring实战),加深理解。...日志代码往往横向地散布在所有对象层次,而与它对应对象核心功能毫无关系对于其他类型代码,安全性、异常处理和透明持续性也都是如此,这种散布在各处无关代码被称为横切(cross cutting...Target:目标类,需要被代理类,:UserService Advice:通知,所要增强增加功能,定义了切面的“什么”和“何时”,模式有Before、After、After-returning...3、AOP实现 (1)动态代理 使用动态代理可以为一个多个接口在运行期动态生成实现对象,生成对象实现接口方法时可以添加增强代码,从而实现AOP: /** * 动态代理类 */ public...@After 后置通知,请求参数JoinPoint,在目标方法执行之后,无论是否发生异常,都进行执行通知。在后置通知,不能访问目标方法执行结果(因为有可能发生异常),不能改变方法执行结果。

    83120

    Spring AOP使用

    AOP采用横向抽取机制,将分散在各个方法重复代码抽取出来,然后在程序编译运行时,再将这些提取出来代码应用到需要执行地方。   ...目前最流行AOP框架有两个,分别是Spring AOP和AspectJ。其中:Spring AOP采用纯Java实现,不需要专门编译过程和类加载器,在运行期间通过代理方式向目标类织入增强代码。...指定将切面Bean该方法转换为增强处理。 throwing 该属性只对元素有效,它用于指定一个形参名,异常通知方法可以通过该形参访问目标方法所抛出异常。...它用于指定一个形参名,后置通知方法可以通过该形参访问目标方法返回值。 案例一:表示任意方法任意类任意参数都走切面。...-- 3.2.2 后置通知,在方法返回之后执行,就可以获得返回值 returning属性:用于设置后置通知第二个参数名称,类型是Object --> <aop:after-returning

    16310

    SpringBoot 2.x 进阶 之 Web

    spring.resources.static-locations=classpath:/static,classpath:/public 备注:static 下静态资源图片以及静态html文件,通过浏览器可以直接访问到... spring-boot-starter-aop 编写一个切面通知类 package com.xmlvhy.girl.aspect...object){ log.info("response= {}",object); log.info("==============doAfterReturning 所请求接口方法执行之后返回结果之前执行...Pointcut:声明需要处理切点 spring aop 通知(advice)分成五类: @Before:前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点执行,除非此处抛出异常...例如可以创建4xx.html5xx.html页面,用来匹配所有该类型错误(会先进行精确匹配) 5.4、定义异常通知方式 这里我们做一个简单用例,获取某个人年龄并判断,小于10 ,返回“你应该在上小学

    44020

    Spring系列六:AOP概念和使用

    AOP19.说说什么是AOPAOP:面向切面编程。简单说,就是把一些业务逻辑相同代码抽取到一个独立模块,让业务逻辑更加清爽。...编辑Java语言执行过程AOP 核心其实就是动态代理,如果是实现了接口的话就会使用 JDK 动态代理,否则使用 CGLIB 代理,主要应用于处理一些具有横切性质系统级服务,日志收集、事务管理、安全检查...切面(Aspect):类是对物体特征抽象,切面就是对横切关注点抽象 连接点(Joinpoint):被拦截到点,因为 Spring 只支持方法类型连接点,所以在 Spring连接点指就是被拦截到方法...,实际上连接点还可以是字段或者构造器 切点(Pointcut):对连接点进行拦截定位 通知(Advice):所谓通知就是指拦截到连接点之后要执行代码,也可以称作增强 目标对象 (Target...需要特殊类加载器,它可以在目标类被引入应用之前增强该目标类字节码。 运行期织入:切面在应用运行某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。

    27740

    Spring boot中使用aop详解

    aopspring两大功能模块之一,功能非常强大,为解耦提供了非常优秀解决方案。 现在就以springbootaop使用来了解一下aop。...@AfterThrowing方法里,可以加throwing = "XXX",供读取异常信息,本例可以改为: //后置异常通知 @AfterThrowing(throwing = "ex",...匹配任意字符,可以匹配任意多个元素,表示类时,必须和*联合使用 +  必须跟在类名后面,Horseman+,表示类本身和继承扩展指定类所有类 参考:http://blog.csdn.net/...autfish/article/details/51184405 除了execution(),Spring还支持其他多个函数,这里列出名称和简单介绍,以方便根据需要进行更详细查询  @annotation...spring aop就是一个同心圆,要执行方法为圆心,最外层order最小。从最外层按照AOP1、AOP2顺序依次执行doAround方法,doBefore方法。

    1.4K40

    SpringBoot AOP 记录日志实例

    AOP是OOP延续,是软件开发一个热点,也是Spring框架一个重要内容,是函数式编程一种衍生范型。...、通知(advice) 所谓通知就是指拦截到连接点之后要执行代码,通知分为前置、后置、异常、最终、环绕通知五类 6、目标对象 代理目标对象 7、织入(weave) 将切面应用到目标对象并导致代理对象创建过程...8、引入(introduction) 在不修改代码前提下,引入可以在运行期为类动态地添加一些方法字段 SpringAOP支持 SpringAOP代理由SpringIOC容器负责生成、管理,...Advice:Advice 定义了在 pointcut 里面定义程序点具体要做操作,它通过 before、after 和 around 来区别是在每个 joint point 之前之后还是代替执行代码...类型Date在任何直接java子包java.util.Date和java.sql.Date java..* 任何在java包或者所有子包类型

    1.8K11

    Spring Boot AOP 扫盲

    AOPSpring 体系中非常重要两个概念之一(另外一个是 IoC),今天这篇文章就来带大家通过实战方式,在编程猫 SpringBoot 项目中使用 AOP 技术为 controller 层添加一个切面来实现接口访问统一日志记录...一、关于 AOP AOP,也就是 Aspect-oriented Programming,译为面向切面编程,是计算机科学一个设计思想,旨在通过切面技术为业务主体增加额外通知(Advice),从而对声明为...通知方式有五种: @Before:通知方法会在目标方法调用之前执行 @After:通知方法会在目标方法调用后执行 @AfterReturning:通知方法会在目标方法返回后执行 @AfterThrowing...:通知方法会在目标方法抛出异常后执行 @Around:把整个目标方法包裹起来,在被调用前和调用之后分别执行通知方法 4)连接点(JoinPoint),通知应用时机,比如接口方法被调用时就是日志切面的连接点...三、实操 AOP 记录接口访问日志 第一步,在 Spring Boot 项目的 pom.xml 文件添加 spring-boot-starter-aop 依赖。

    53410

    自定义注解妙用,一行代码搞定用户操作日志记录

    这个时侯就用到了自定义注解,把想要记录内容放在注解,通过切入点来获取到注解参数,然后将参数插入数据库记录 2.Spring AOP 2.1.关于Spring AOP一些术语 切面(Aspect):...在Spring AOP,切面可以使用通用类或者在普通类以@Aspect 注解(@AspectJ风格)来实现 连接点(Joinpoint):在Spring AOP中一个连接点代表一个方法执行 通知(...许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心拦截器链 切入点(Pointcut):定义出一个一组方法,当执行这些方法时可产生通知Spring缺省使用AspectJ...(不论是正常返回还是异常退出) 环绕通知(@Around):包围一个连接点(join point)通知方法调用。...这是最强大一种通知类型,环绕通知可以在方法调用前后完成自定义行为,它也会选择是否继续执行连接点直接返回它们自己返回值抛出异常来结束执行。

    73820

    Spring系列(十三):AOP相关知识笔记

    通过预编译方式和运行期动态代理实现程序功能统一维护技术。AOP技术是Spring框架一个重要内容。...3、AOP常用注解 注解 注解说明 @Aspect 切面声明:通常标注在类、接口(包括注解类型)枚举上。 @Pointcut 切入点声明:即切入到哪些目标类目标方法。...value 属性绑定通知切入点表达式,可以关联切入点声明,也可以直接设置切入点表达式注意:如果在此回调方法抛出异常,则目标方法不会再执行,会继续执行后置通知 -> 异常通知。...@After 后置通知,:在目标方法(切入点)执行之后执行 @AfterRunning 返回通知,:在目标方法(切入点)返回结果之后执行,在 @After 后面执行pointcut 属性绑定通知切入点表达式...,在目标方法调用之前之后执行自定义行为 @Around("webLog()") public Object doAround(ProceedingJoinPoint joinPoint

    25220

    SpringBoot2.0 基础案例(11):配置AOP切面编程,解决日志记录业务

    一、AOP切面编程 1、什么是AOP编程 在软件业,AOP为Aspect Oriented Programming缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能统一维护一种技术...AOP是OOP(面向对象编程)延续,是软件开发一个热点,也是Spring框架一个重要内容,是函数式编程一种衍生范型。...:spring采用 jdk 动态代理Proxy 5)实现类:spring 采用 cglib字节码增强 3、AOP术语和图解 1)target:目标类 需要被代理类。...是切入点pointcut和通知advice结合 一个线是一个特殊面。...一个切入点和一个通知,组成成一个特殊面。 ? 二、与SpringBoot2.0整合 1、核心依赖 <!

    93220

    给SpringBoot接口加全局日志(AOP

    我沉思了许久,终于有一个好办法 ,就是Spring特性AOP(面向切面编程) ? 直接就在进入和返回直接加日志: ?...在业务逻辑执行过程AOP会把分离出来切面和关注点动态切入到业务流程,这样做好处是提高了功能代码重用性和可维护性。...AopEmailNotice是一个业务类,负责发送通知给老师,在发送通知之前需要验证老师身份。...AOP会在AopEmailNotice类setTeacher方法执行之前,将beforeAdvice关注点切入到AopEmailNotice业务类,并执行beforeAdvice方法。...被一个或者多个切面所通知对象。例如,前面案例AopEmailNotice类。 ● Proxy 表示代理对象。将通知应用到目标对象之后被动态创建对象。

    1.9K30

    何在 Spring 异步调用传递上下文什么是异步调用?

    异步调用指,在程序在执行时,无需等待执行返回值即可继续执行后面的代码。在我们应用服务,有很多业务逻辑执行操作不需要同步返回(发送邮件、冗余数据表等),只需要异步执行即可。...Spring 应用实现异步 Spring 为任务调度与异步方法执行提供了注解支持。通过在方法类上设置 @Async注解,可使得方法被异步调用。...在 Spring @Async 异步线程使用过程,需要注意是以下用法会使 @Async 失效: 异步方法使用 static 修饰; 异步类没有使用 @Component 注解(其他注解)导致 Spring...无法扫描到异步类; 异步方法不能与被调用异步方法在同一个类; 类需要使用 @Autowired @Resource 等注解自动注入,不能手动 new 对象; 如果使用 Spring Boot...最后介绍如何在异步多线程传递线程上下文信息。线程上下文传递在分布式环境中会经常用到,比如分布式链路追踪需要一次请求涉及到 TraceId、SpanId。简单来说,需要传递信息能够在不同线程

    2.1K30

    何在 Spring 异步调用传递上下文

    异步调用指,在程序在执行时,无需等待执行返回值即可继续执行后面的代码。在我们应用服务,有很多业务逻辑执行操作不需要同步返回(发送邮件、冗余数据表等),只需要异步执行即可。...Spring 应用实现异步 Spring 为任务调度与异步方法执行提供了注解支持。通过在方法类上设置 @Async注解,可使得方法被异步调用。...在 Spring @Async 异步线程使用过程,需要注意是以下用法会使 @Async 失效: 异步方法使用 static 修饰; 异步类没有使用 @Component 注解(其他注解)导致 Spring...无法扫描到异步类; 异步方法不能与被调用异步方法在同一个类; 类需要使用 @Autowired @Resource 等注解自动注入,不能手动 new 对象; 如果使用 Spring Boot...最后介绍如何在异步多线程传递线程上下文信息。线程上下文传递在分布式环境中会经常用到,比如分布式链路追踪需要一次请求涉及到 TraceId、SpanId。简单来说,需要传递信息能够在不同线程

    3.3K30

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券