注解 + spring aop切面+ SpringEl

这篇具有很好参考价值的文章主要介绍了注解 + spring aop切面+ SpringEl。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FlowStart {

    /**
     * 流程类型
     */
    String flowType();

    /**
     * uuid
     */
    String uuid();

    /**
     * 是否删除原来流程
     */
    boolean deleteOld() default false;
}

定义切面

/**
 * 流程启动切面
 * @author GuoYong
 * @since 2023/9/6
 */
@Aspect
@Component
public class FlowStartAspect {

    private final ProcessInstanceClient processInstanceClient;

    public FlowStartAspect(ProcessInstanceClient processInstanceClient) {
        this.processInstanceClient = processInstanceClient;
    }

    /**
     * 定义切面
     */
    @Pointcut("execution(@com.config.FlowStart * *(..))")
    private void startAspect() {

    }

    @Around("startAspect()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        Object proceeded = joinPoint.proceed(args);
        // 获取注解
        FlowStart flowStart = getAnnotationLog(joinPoint);
        // 获取注解的值
        String flowType = flowStart.flowType();
        String uuidEl = flowStart.uuid();
        boolean deleteOld = flowStart.deleteOld();
        // 解析el表达式
        ExpressionParser parser = new SpelExpressionParser();
        LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer();
        Method targetMethod = getTargetMethod(joinPoint);
        String[] params = discoverer.getParameterNames(targetMethod);
        EvaluationContext context = new StandardEvaluationContext();
        for (int len = 0; len < params.length; len++) {
            context.setVariable(params[len], args[len]);
        }
        Expression expression = parser.parseExpression(uuidEl);
        String uuids = expression.getValue(context, String.class);
        String [] uuidArray = uuids.split(",");
        for (String uuid : uuidArray) {
            if (deleteOld) {
                processInstanceClient.deleteByBusinessKey(uuid);
            }
            Result result = processInstanceClient.init(InitProcessDto.builder()
                    .businessKey(uuid)
                    .processKey(flowType)
                    .build());
            if (!result.isOk()) {
                throw new RuntimeException("流程启动失败");
            }
        }
        return proceeded;
    }

    private Method getTargetMethod(JoinPoint joinPoint) {
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        return method;
    }

    /**
     * 是否存在注解,如果存在就获取
     */
    private FlowStart getAnnotationLog(JoinPoint joinPoint) {
        Method method = getTargetMethod(joinPoint);
        if (method != null) {
            return method.getAnnotation(FlowStart.class);
        }
        return null;
    }

}

使用

  @FlowStart(flowType = ProcessKeyConstants.DUTY_SCHEDULING_FLOW, uuid = "#editDutySchedulingDto.businessKey", deleteOld = true)

文章来源地址https://www.toymoban.com/news/detail-698470.html

到了这里,关于注解 + spring aop切面+ SpringEl的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring进阶系列丨第十篇】基于注解的面向切面编程(AOP)详解

    ​ 注意,该类的两个细节: a、@Component注解向容器中注册一个Bean。 b、@Aspect注解表示这个是一个切面类。 c、@Before注解表示的是这个是前置增强/前置通知。 ​ 注意:对于业务Bean,我们也需要通过@Service注解来向容器中注册。 ​ 问题:我们看到对于切面类中定义的通知,有

    2024年04月23日
    浏览(38)
  • Spring Boot学习随笔- 实现AOP(JoinPoint、ProceedingJoinPoint、自定义注解类实现切面)

    学习视频:【编程不良人】2021年SpringBoot最新最全教程 问题 现有业务层开发存在问题 额外功能代码存在大量冗余 每个方法都需要书写一遍额外功能代码不利于项目维护 Spring中的AOP AOP:Aspect 切面 + Oriented 面向 Programmaing 面向切面编程 Aspect(切面) = Advice(通知) + Pointcut(

    2024年02月04日
    浏览(33)
  • Java AOP 通过注解实现切面及通过注解改变返回值

    学习过java的小伙伴都知道Spring的重要知识点之一就是AOP,AOP也就是切面编程,切面编程它能够帮助我们实现非侵入式的功能增强,解耦现有的业务逻辑和要新增的功能增强。 实际应用中的场景 事务管理、拦截器、日志处理、权限控制等。 AOP的增强方式 前置增强、后置增强

    2024年02月14日
    浏览(28)
  • Java注解方式实现aop,切点切面实战

    注解方式实现aop我们主要分为如下几个步骤(有更好的方法的话,欢迎交流): 1.在切面类(为切点服务的类)前用@Aspect注释修饰,声明为一个切面类。 2.用@Pointcut注释声明一个切点,目的是为了告诉切面,谁是它的服务对象。(此注释修饰的方法的方法体为空,不需要写功

    2024年02月12日
    浏览(25)
  • 如何将重复方法封装为Aop切面并结合注解使用

    首先要导入依赖 编写注解 编写Aop 方法上添加注解   然后测试就发现添加代码的方法都可以防止重复提交了!!

    2024年02月02日
    浏览(39)
  • Spring AOP:面向切面编程

    在软件开发中,我们经常会遇到一些横切关注点(cross-cutting concerns),如日志记录、事务管理和安全性等。这些关注点不属于特定的模块或类,而是横跨整个应用程序。传统的面向对象编程方法往往会将这些关注点与核心业务逻辑混杂在一起,导致代码的可读性和可维护性下

    2024年02月09日
    浏览(32)
  • Spring面向切面编程(AOP)

    AOP(Aspect Oriented Programming),即面向切面编程,利用一种称为\\\"横切\\\"的技术,剖开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为\\\"Aspect\\\",即切面。所谓\\\"切面\\\",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装

    2024年02月07日
    浏览(33)
  • javaee spring 测试aop 切面

    spring配置文件

    2024年02月09日
    浏览(27)
  • Spring-aop面向切面

    1、理解必要的专业术语  先看看上面图,这是我的个人理解。(画的丑,主打真实)         1)Advice,通知/增强:类方法中提出来的共性功能(大白话就是提出来的重复代码)         2)Pointcut,切入点/切点:通知返回的方法         3)连接点:方法         4)织入:

    2023年04月15日
    浏览(71)
  • spring之面向切面:AOP(2)

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需写作干货注入能量… 热爱写作,愿意让自己成为更好

    2024年02月04日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包