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