当前位置: 首页 > 知识库问答 >
问题:

Spring AOP:捕获内部私有方法调用(@EnableAspectJAutoproxy)

何乐
2023-03-14

我需要捕获私有的内部调用方法。

@Configuration
@EnableAspectJAutoProxy
public class ApiConfiguration implements WebMvcConfigurer { /*...*/ }
package net.space.service;

// imports

@Service    
public class RepositoryService {
    private void privateMethod(String param) {
        /* Do something */
    }

    public void innerCaller() {
        this.privateMethod(null);
    }
}

然而,却始终得不到建议。我该怎么解决呢?

我也尝试过这个切入点:

@Pointcut(value = "execution(* privateMethod(..))")
public void privatePointcut() {
}

和建议:

@AfterReturning("privatePointcut()")
public void groupMetrics(JoinPoint point) throws Throwable {
    // Do something
}
@Pointcut(value = "execution(* net.space.service.RepositoryService.privateMethod(..))")
@Pointcut(value = "execution(* RepositoryService.privateMethod(..))")

共有1个答案

袁弘方
2023-03-14

我得到了答案;

Spring AOP是基于代理的,但在非公共方法方面有限制;

由于Spring的AOP框架的基于代理的性质,受保护的方法根据定义是不被拦截的,对于JDK代理(如果这不适用)和CGLIB代理(如果这在技术上是可能的,但对于AOP的目的不推荐)都是不被拦截的。因此,任何给定的切入点都将只与公共方法匹配!

这里给出的示例使用XML样式配置,也可以配置和使用@aspectj和Java配置。具体来说,@enableLoadTimeWeaving注释可以作为替代(请参阅下面的详细信息)。

所以你能试着用;

@Configuration
@EnableLoadTimeWeaving
public class ApiConfiguration implements WebMvcConfigurer { /*...*/ }
 类似资料:
  • 我认为这是Spring AOP的局限性 除了Spring AOP还有别的选择吗

  • 我试图模拟一个私有方法(executeGetRequest),在我声明要为私有方法返回的模拟的那一行中,私有方法实际上是用null参数执行的,因此抛出了一个NullPointerException。 VlcPlayerMinimal。爪哇: VlcPlayerMinimalTest。爪哇: 堆栈跟踪: 它似乎PowerMockito实际上是调用的方法,我试图在行PowerMockito.do返回(

  • 捕获日志的旧方法如上图所示。以下是我的问题: > 如果我使用Spring AOP实现上述方法,这个记录器将被删除,但是Spring AOP是否能够捕获这个日志消息?(据我所知,Spring AOP不查看方法内部) 如果第1)条的答案是肯定的,那么如何做到? 我假设在实现Spring AOP之后,上面的代码应该是这样的。记录器调用不再在测试方法中,因为它将由方面类处理。这不正是AOP的目的吗?从对象

  • 我试图模仿一个私有方法,如下所示。但是,在第4行,JUnit正在调用相关的validateLanguage方法,并且由于私有方法validateLanguage在调用其他方法时引发了异常,因此没有返回模拟值。我的理解是,使用PowerMock的JUnit应该跳过validateLanguage实际实现的调用。有人能澄清一下吗?

  • 问题内容: 如何使用方法句柄调用私有方法? 据我所知,只有两种可公开访问的实例: 也不允许无限制的私人访问。 有非公开组织可以满足我的需求。是否有一些公开的方式来获取它(假设SecurityManager允许它)? 问题答案: 事实证明,可以使用Lookup#unreflect(Method)并暂时使方法可访问(除非在程序初始化期间完成,否则可能会引入小的安全性问题)。 这是Thorben的答案的

  • 问题内容: 我有一个具有称为的私有方法的类。我想从外面打电话。我认为应该可以反思,但是我得到了。有任何想法吗??? 问题答案: 利用使用其之前的Method对象的方法。