为了账号安全,请及时绑定邮箱和手机立即绑定

使变量可用于连接点而不更改方法签名并稍后使用它

使变量可用于连接点而不更改方法签名并稍后使用它

繁星淼淼 2023-06-28 16:27:53
使用 @Around 方面和 Spring boot 时。在 joinPoint 执行之前创建变量、在 joinPoint 执行期间使其可用以收集其中的数据以及在 joinPoint 执行之后使用变量中收集的数据的最佳方法是什么?假设是多线程环境。@Aspect@EnableAspectJAutoProxypublic class SomeConfig {    @Around(value = "@annotation(path.to.my.annotation.here)", argNames = "specificArg")    public void doLogic(ProceedingJoinPoint joinPoint) throws Throwable {        //create local variable X for thread execution here        try{            joinPoint.proceed(); //or joinPoint.proceed(Object[]);        }        finally {        //use local variable X to do some logic        }    }}不想使用自定义注释更改方法签名。任何设计模式或实现示例都会有很大帮助。谢谢!
查看完整描述

1 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

您可以创建一个保险箱ThreadLocal并设置所需的变量,然后使用它。


public class VariableContext {


    private static ThreadLocal<String> currentVariable = new ThreadLocal<String>() {

        @Override

        protected String initialValue() {

            return "";

        }

    };


    public static void setCurrentVariable(String tenant) {

        currentVariable.set(tenant);

    }


    public static String getCurrentVariable() {

        return currentVariable.get();

    }


    public static void clear() {

        currentVariable.remove();

    }


}

您可以在这里或其他课程中使用它。


@Aspect

@EnableAspectJAutoProxy

public class SomeConfig {


    @Around(value = "@annotation(path.to.my.annotation.here)", argNames = "specificArg")

    public void doLogic(ProceedingJoinPoint joinPoint) throws Throwable {


        //create local variable X for thread execution here

        try{

            joinPoint.proceed(); //or joinPoint.proceed(Object[]);

        }

        finally {

        //use local variable X to do some logic

            VariableContext.setCurrentVariable("someValue");

            String result = VariableContext.getCurrentVariable();


        }

    }

}


查看完整回答
反对 回复 2023-06-28
  • 1 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信