Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中调用另一个方法时触发一个方法(或者如何在没有aop的情况下执行aop)_Java_Spring_Aop_Spring Aop - Fatal编程技术网

在java中调用另一个方法时触发一个方法(或者如何在没有aop的情况下执行aop)

在java中调用另一个方法时触发一个方法(或者如何在没有aop的情况下执行aop),java,spring,aop,spring-aop,Java,Spring,Aop,Spring Aop,我正在尝试实现“before”和“after”方法调用的功能 我尝试了SpringAOP,但它有缺陷(我怀疑它是java应用程序中groovy的组合) 我不想使用java反射 我认为创建一个以函数作为参数的方法在这里并不合适,因为函数已经存在于另一个类中 以下是我想做的(这只是活动的一部分,我还有10个类似的活动): 如何使每个桶中重复的第一、第二和第四行自动且优雅 谢谢 编辑: 我提到的aop的问题是,我得到了所有突然出现的空指针,而没有aop,这是正常的。 我是如何实现aop的 @目标(E

我正在尝试实现“before”和“after”方法调用的功能

  • 我尝试了SpringAOP,但它有缺陷(我怀疑它是java应用程序中groovy的组合)

  • 我不想使用java反射

  • 我认为创建一个以函数作为参数的方法在这里并不合适,因为函数已经存在于另一个类中

  • 以下是我想做的(这只是活动的一部分,我还有10个类似的活动):

    如何使每个桶中重复的第一、第二和第四行自动且优雅

    谢谢

    编辑: 我提到的aop的问题是,我得到了所有突然出现的空指针,而没有aop,这是正常的。 我是如何实现aop的

    
    @目标(ElementType.METHOD)
    @保留(RetentionPolicy.RUNTIME)
    public@interface MyMonitor{}
    @面貌
    @组成部分
    公共类时间监视方面{
    @自动连线
    计量学计量学;
    @大约(“@annotation(com.path.to.MyMonitor)”)
    在(ProceedingJoinPoint-joinPoint)抛出可丢弃之前的public void{
    long startTimeMetric=System.nanoTime();
    String methodName=joinPoint.getSignature().getName();
    Timer Timer=meterRegistry.Timer(methodName);
    joinPoint.procedure();
    timer.record(System.nanoTime()-startTimeMetric,TimeUnit.NANOSECONDS);
    }
    }
    

    对于我想要测量时间的每个方法,我在该方法之前注释了@MyMonitor,它大部分时间都有效,但在某些情况下,它给出了我提到的空指针

    就AOP而言,您仍然可以使用以下方法实现

  • 使用装饰图案。参考这个和这个
  • 您可以使用Java的InvocationHandler,请参阅。但是它使用代理
  • 您也可以使用CGLib,请参阅。它使用反射

  • Spring提供了一种在大多数情况下使用的AOP的简单方法。

    我建议使用lambda表达式:

    publicstaticvoidmain(字符串[]args){
    执行活动(计量登记,“项目1”,任务::活动,媒体容器);
    执行活动(计量登记,“项目2”,任务::活动2,媒体容器);
    }
    公共静态void executeActivity(MeterRegistry MeterRegistry、字符串名称、使用者活动、对象mediaContainer){
    long startTimeMetric=System.nanoTime();
    Timer Timer=meterRegistry.Timer(名称);
    activity.accept(mediaContainer);
    timer.record(System.nanoTime()-startTimeMetric,TimeUnit.NANOSECONDS);
    }
    公共接口计量登记{
    定时器(字符串名称);
    无效记录(长时间);
    }
    
    spring AOP没有任何问题。这是一项成熟的成熟技术!您没有提供任何证据证明SpringAOP是“buggy”。当然,你完全有可能碰到一个bug,请原谅我假设问题就在电脑前面。我在这里做AOP支持已经有几年了,通常人们不阅读手册,不了解SpringAOP与AspectJ相比的局限性,也从不努力理解AOP或AspectJ语法的一般概念。那么,为什么不在这里用实际代码表示AOP问题,这样我们就可以决定是提交错误报告还是修复自己的错误?您的
    MeterRegistry
    界面具有
    记录
    方法,该方法来自
    定时器
    界面。
                long startTimeMetric = System.nanoTime()
                Timer timer = meterRegistry.timer("item 1")
                myObject.theActivity(mediaContainer)
                timer.record(System.nanoTime() - startTimeMetric, TimeUnit.NANOSECONDS)
    
                long startTimeMetric = System.nanoTime()
                Timer timer = meterRegistry.timer("item 2")
                myObject2.theActivity2(mediaContainer)
                timer.record(System.nanoTime() - startTimeMetric, TimeUnit.NANOSECONDS)