SpringAop通过el表达式动态获取方法入参的值

清洁机器人之屏幕(中,大LCD)方案--ITE 联阳986x系列 soc显控芯片介绍 阅读详情

1.新增工具类

import lombok.Data;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.context.expression.MethodBasedEvaluationContext;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.expression.Expression;
import org.springframework.expression.spel.standard.SpelExpressionParser;

import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * SpElUtils的增强工具类,相比于SpelUtils,增加了切面对象的上下文。
 * MethodAspectUtils提供的对象,请参考:https://docs.spring.io/spring-framework/reference/integration/cache/annotations.html#cache-spel-context
 * 注意:该方法不支持#beanName语法。
 *
 * 应用场景:
 * <pre>
 *     @Before(value = "@annotation(resource)")
 *     public void checkOperationRight(JoinPoint jp, ProtectResource resource) {
 *         if (!MethodAspectUtils.evaluateWithJoinPointContext(resource.condition(), jp)) {
 *             throw new NoPermissionException("没有权限");
 *         }
 *     }
 *
 *     @ProtectResource(condtion = "#scope.fullDataAccess")
 *     public Department saveOrUpdate(DeptSaveDTO dto, UserDataScope scope) {
 *
 *     }
 * </pre>
 *
 * @see org.springframework.cache.annotation.Cacheable#key()
 * @author zhanghuangbin
 * @date 2024/11/15
 */
public class MethodAspectUtils {


    private static final Map<String, Expression> KEY_CACHE = new ConcurrentHashMap<>(64);

    /**
     *
     * @param el spel表达式,<a href="https://docs.spring.io/spring-framework/reference/integration/cache/annotations.html#cache-spel-context">语法</a>
     *           不支持#beanName语法
     * @param jp
     * @return
     * @param <T>
     */
    public static <T> T evaluateWithJoinPointContext(String el, JoinPoint jp) {
       return evaluateWithJoinPointContext(el, jp, null);
    }

    /**
     *
     * @param el
     * @param jp
     * @param result ProceedingJoinPoint.proceed()的结果
     * @return
     * @param <T>
     */
    public static <T> T evaluateWithJoinPointContext(String el, JoinPoint jp, Object result) {
        Expression expression = KEY_CACHE.computeIfAbsent(el, (key) -> {
            SpelExpressionParser parser = new SpelExpressionParser();
            return parser.parseExpression(key);
        });


        MethodContext context = new MethodContext(jp, result);
        MethodBasedEvaluationContext ctx = new MethodBasedEvaluationContext(context, context.getMethod(), context.getArgs(), new DefaultParameterNameDiscoverer());
        ctx.setVariables(context.getAsVariables());
        return (T) expression.getValue(ctx);
    }


    @Data
    static class MethodContext implements Serializable {

        private final Object[] args;

        private final Object target;

        private final Method method;

        private final String methodName;

        private final Class<?> targetClass;

        private Object result;

        public MethodContext(JoinPoint jp) {
            this(jp, null);
        }

        public MethodContext(JoinPoint jp, Object result) {
            args = jp.getArgs();
            target = jp.getTarget();
            method = ((MethodSignature) jp.getSignature()).getMethod();
            methodName = method.getName();
            targetClass = target.getClass();
            this.result = result;
        }

        public Map<String, Object> getAsVariables() {
            Map<String, Object> map = new HashMap<>();
            map.put("args", args);
            map.put("target", target);
            map.put("method", method);
            map.put("methodName", methodName);
            map.put("targetClass", targetClass);
            map.put("result", result);
            return map;
        }
    }
}

2. 在切面中使用

@Aspect
@Slf4j
@Component
public class ToggleDatasourceAspect {

    @Around("@annotation(datasource)")
    public Object selectTargetDatasource(ProceedingJoinPoint joinPoint, ToggleDatasource datasource) throws Throwable {
        String el = datasource.databaseId();
        log.info("ToggleDatasource selectTargetDatasource el={}", el);
        String databaseId = MethodAspectUtils.evaluateWithJoinPointContext(el, joinPoint);
        try {
            DynamicDataSourceContextHolder.push(databaseId);
            return joinPoint.proceed();
        } finally {
            DynamicDataSourceContextHolder.poll();
        }
    }
}
Python 爬虫实战:抓取新闻网站上的新闻标题和内容 随着信息化的进展,新闻网站已经成为人们获取新闻和时事资讯的主要途径。许多新闻网站提供了丰富的内容,涵盖了社会、政治、科技、娱乐等多个领域。通过抓取新闻网站的内容,我们可以分析新闻的趋势,获取某一领域的最新动态,甚至为数据分析和机器学习提供数据支持。本文将详细介绍如何使用 Python 编写爬虫,抓取新闻网站上的新闻标题和内容。requests:发送 HTTP 请求,获取页面内容。:解析 HTML 页面并提取数据。Selenium:抓取动态加载的网页内容。新闻API。 阅读详情

相关推荐

从零搭建Simulink-Adams联合仿真平台:实现电机转速的精准闭环控制

本文详细介绍了从零搭建Simulink-Adams联合仿真平台的完整流程,旨在实现电机转速的精准闭环控制。通过将Simulink的控制算法与Adams的物理模型相结合,构建了一个包含真实机械效应的数字孪生系统。文章涵盖了Adams物理模型构建、接口定义、Simulink控制闭环搭建、PID参数调试以及常见避坑指南,为机电系统仿真提供了实用的工程实践指导。

weixin_29189373的博客 151

Spring AOP(获取入参和返回值)及其原理:动态代理

此篇会先演示Spring AOP(获取入参和返回值),之后再演示AOP的原理:动态代理。 Spring AOP: AOP思想: AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个...

象话的博客 5万+

大数据审计常用的算法模型

数据预处理:用聚类算法(K-Means)对数据分组,缩小分析范围;异常初筛:用孤立森林/DBSCAN快速标记疑似异常样本;风险分级:用随机森林/XGBoost对疑似异常打分,确定核查优先级;关联深挖:用FP-Growth挖掘异常样本背后的人员/流程关联;文本佐证:用BERT分析相关合同/审批文本,获取舞弊证据。例如,某审计项目通过“K-Means分组→孤立森林标异常→FP-Growth找关联→BERT审合同”的流程,仅用1周就完成了过去3个月需10人团队的工作量,且挖出2起隐藏的串标舞弊案。

Yulay专栏 1065

Spring Aop 动态获取参数值替换注解值

Service@MyAnnotation(key = "'param id is ' + #id")//添加自定义aop注解 #id为el表达式,需要和被替换的参数名称相同System.out.println("方法执行中");//切面类必须由容器管理@Component//定义为切面类@Aspect//定义切入点//获取方法签名//获取切入方法的对象//获取方法上的Aop注解。

weixin_46120382的博客 1091

Python使用netmiko配置华为交换机

1.netmiko就是专门为网络设备做的模块,非常强大。1.更适合网络设备的自动化运维模块。2、批量配置变更、备份。1.安装netmiko。2. 创建SSH连接。一、netmiko介绍。

博然的宝藏库 2794

STM32H750xx【QSPI】轮询方式读写GD25Q64E

本文详细介绍了GD25Q64E其特性、引脚定义及功能说明,重点阐述了在STM32H750平台上通过CubeMX配置QuadSPI接口的步骤,包括时钟设置、参数优化等。文章提供了完整的BSP驱动开发流程,涵盖写使能、四线模式使能、ID读取、解除保护、扇区擦除、整片擦除、页编程和数据读取等关键功能实现,并通过读写测试验证了DummyCycles参数对数据准确性的影响。

honmy18的博客 1421

Java --Spring EL 表达式的工具类

【代码】Java --Spring EL 表达式的工具类。

迷迷糊糊,懵懵懂懂 974

腾讯云CodeBuddy+微信小程序:5分钟开发番茄小闹钟

番茄钟是一种简单的时间管理方法。这个方法很简单:你专注工作25分钟,然后休息5分钟。这样可以让你更专心,不容易分心,还能防止过度疲劳。 很多人用番茄钟来提高工作效率,因为它能帮助你更好地管理时间。不过,市面上的一些免费番茄钟应用常常会有广告弹出来,影响使用体验。这就是为什么我们要开发一个没有广告的番茄钟小程序,让用户可以专心工作,不被打扰。

2201_75366661的博客 1685

自定义注解——AOP中 将注解中的el表达式 自动替换为同名方法参数值

@AemsRedisCache(key = "'spatialId_'+#spatialId+'_neId_+'#neId'") public SfSpatial findBySpatialId(String spatialId,String neId) throws Exception{ String sql = SpatialDB.Find_Spatial_By_Spa...

qq_35232663的博客 2177

手把手教你学simulink(16.8)--基于Simulink的小波变换滤波器(Wavelet Transform Filter)项目

基于Simulink的小波变换滤波器(Wavelet Transform Filter)项目的详细实例介绍。这个项目将重点放在小波变换滤波器的设计、实现和仿真上,帮助你理解和应用小波变换滤波器在信号处理中的作用。

MHD0815的博客 532

Android 12.0 kenel中修改rom系统内部存储的大小

在12.0的系统rom产品开发定制中,在对一些产品开发中的配置需求方面,由于在产品后续订单中,有些产品是出口的,但是硬件方面已经定板,时间比较仓促,所以 就需要软件方面在rom内部存储的大小方面作假,修改rom真实的大小容量,所以就需要在kenel驱动部分来修改这部分的值最好了,接下来分析下计算rom容量的 相关代码,然后做出相关的修改,来实现功能

安卓兼职framework和app工程师的博客 1677

AOP切面动态获取方法参数并回写标识

本案例直接运用AOP切面动态获取方法参数并回写标识,其中重点是AOP切面环绕增强逻辑处理与请求参数回写,以及内部通过Spring 表达式语言来动态解析注解方法参数,大大提升代码可读性与可维护性。

勤于笔记,成于点滴。 5390

EtherCAT主站SOEM -- 1 -- SOEM之ethercattype.h文件分析

“ethercattype.h” 文件用于支持 EtherCAT 网络通信,提供了各种类型定义和宏,以便开发者更轻松地开发 EtherCAT 相关应用程序。这些定义包括数据类型、命令类型、状态类型和错误类型,以支持 EtherCAT 通信。根据具体应用需求,还可以调整一些超时和帧长度设置。这些定义用于处理函数调用的结果,如 EC_NOFRAME(没有帧返回)、EC_ERROR(一般错误)、EC_TIMEOUT(请求超时)等。这些定义用于处理 EtherCAT 命令,例如 EC_CMD_APRD(自动递增读取

常驻客栈的博客--嵌入式EtherCAT 2713

redis缓存与删除SpringAOP方式,支持SpringEl表达式

【前置条件】 1.maven关键依赖: <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.1.RELEASE</version> ...

fubaojiexing的博客 1173

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

AOP + Spring-EL表达式构建优雅的系统操作日志框架

操作日志

hjg719的博客 1756

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

借助spring的SpEL和AOP面向注解的切面编程

1:第一次写博客,如果有问题请多多包含,   先说下思路:   1.1 :先建立一个注解类,这个是使用在方法上的。   1.2 :再建立一个专门做spring的bean的方法中传参解析的EL类。 1.3 : 这里我们还需要一个处理spring的AOP的类,针对注解做切面编程 , 这个类可以做公共日志打印   接下来就直接上代码了,下面的类是根据上面的思路来的。 1:注解类:用来放在方法...

xiaofei19901122的博客 888

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Spring(3)——EL,AOP

文章目录1 Spring EL1.1 XML形式1.2 注解形式1.3 Spring EL使用List和Map2 AOP 面向切面编程3 Struts2+Hibernate+Spring整合 1 Spring EL Spring EL可以使用运算符 例如:< property name="username" value="#{1 == 1}"/> 返回true 常用数学公式几乎都能...

weixin_45044097的博客 691

spring el表达式解析_spring源码系列:Aop基础编程以及Spring Aop基于Aspect注解方式源码分析...

AOP编程中的基本概念连接点:程序执行某个特定位置,如类的初始化前后,某个方法调用前后,方法报出异常后,一个类或者一段代码拥有一些边界性质的特定点。Spring仅支持方法的连接点切点:每个程序都拥有多个连接点。AOP通过切点定位连接点,一个切点可以对应多个连接点。增强:增强是一段代码。是织入到目标类的连接点上的一段代码。目标对象:增强逻辑的织入目标类引介:引介是特殊的增强,他为...

weixin_39836536的博客 457

Redis + Caffeine实现多级缓存

一个关于Redis + Caffeine实现多级缓存的demon,结合spring-cache和Aop实现

qq_48649411的博客 1837

SSM相关面试题(day3)

1.相关知识:@ModelAttribute注解作用:1.用在方法的参数上注解在参数上,会将客户端传递过来的参数按名称注入到指定对象中, 并且会将这个对象自动加入ModelMap中 2.用在Controller的方法上注解在方法上,会在每一个@RequestMapping标注的方法前执行, 如果有返回值,则自动将该返回值加入到ModelMap中2.springMVC数据校验相关知识:Spring MVC 提供了两种数据校验的组件: Hibernate Validator,通过注解完成校验规则的绑定。3.相关

dfghjkkjjj的博客 152

SpringAOP 自定义注解实现 Redis 缓存(支持 Spring EL 表达式)

在 Web 应用中,很多请求总是会一遍遍地去获取一些相同的数据,因为这些数据是无状态的,所以当请求任务完成后,就会立马丢掉所获取的数据,在这些数据中,有些是需要时间去数据库获取,或者远程接口调用获取,或执行复杂运算得到。如果这部分数据变化不那么频繁,或者压根不会变化,我们就可以把这部分数据存入缓存中。缓存技术是提升网站性能的一大利器,有很多优秀的缓存框架如:Ehcache、Redis、Memcac...

GitChat 747

JSP简记

JSP本质上就是一个Servlet

mk1508090060的博客 572

Spring Security的学习使用

一、简介 Spring Security是基于Spring的应用程序提供声明式安全保护的安全性框架,它主要基于Spring Aop和servelet规范里的Filters实现,能够在web请求级别和方法调用级别处理身份认证和授权。 最开始该框架被称为Acegi Security。当时需要几百行xml配置,随着升级2.0,框架更名,再后来到3.0时,加入Spring EL表达式,如今的配置只需要十几行。 二、使用 在早期的版本,因为借助了一系列filter,所以配置filter是必要的,但是,我们不需要配置大

Li_first的博客 297

Spring、SpringAOP、SpringMVC、SpringBoot注解大全及解释

注解 解释 Spring @Autowired Spring提供的工具(由Spring的依赖注入工具(BeanPostProcessor、BeanFactoryPostProcessor)自动注入。) Spring @Configuration 声明当前类是一个配置类(相当于一个Spring配置的xml文件) Spring @Bean 注解在方法上,声明当前方法的返回值为一个Bean。返回的Bean对应的类中可以定义init()方法和destro...

weixin_60589106的博客 2118

业务发生改动需要在保存时新增分布式锁

【代码】业务发生改动需要在保存时新增分布式锁。

sword__wang的博客 151

AOP+SpEL 生成动态的操作日志

大家好!操作日志模块是我们后端项目经常会有的,前段时间我参考了美团的如何优雅地记录操作日志?这一篇文档写了简单版本的AOP+SpEL 生成动态的操作日志,上手简单,超级好用,分享给大家。

Mylqs的博客 948
上一篇: 后端开发规范SKILL
下一篇: SpringBoot+MybatisPlus动态数据源
爱码猿
博客等级 码龄8年 2036粉丝 165原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值