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

3
我需要捕获私有内部调用方法。
因此,我需要在我的Spring Boot项目中使用AspectJ织入:
@Configuration
@EnableAspectJAutoProxy
public class ApiConfiguration implements WebMvcConfigurer { /*...*/ }

我需要捕获一个 @Service私有方法 的执行:
package net.space.service;

// imports

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

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

重要提示: privateMethod私有方法,仅被innerCaller调用。

然而,建议从未被执行。我该怎么解决?

我也尝试了这个切入点:

@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(..))")

编辑

我也尝试使用@EnableLoadTimeWeaving

org.springframework.beans.factory.BeanCreationException: 在类路径资源[org/springframework/context/annotation/LoadTimeWeavingConfiguration.class]中定义的名为'loadTimeWeaver'的bean创建失败:通过工厂方法实例化bean失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.instrument.classloading.LoadTimeWeaver]:工厂方法'loadTimeWeaver'抛出异常;嵌套异常是java.lang.IllegalStateException:ClassLoader [sun.misc.Launcher$AppClassLoader]未提供'addTransformer(ClassFileTransformer)'方法。指定自定义LoadTimeWeaver或使用Spring代理启动Java虚拟机:-javaagent:org.springframework.instrument.jar at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:590) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]


我的回答有帮助吗?请告诉我,如果没有的话我可以提供更多帮助。 - buræquete
1个回答

0

我已经得到了答案;

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

由于Spring AOP框架基于代理,受保护的方法从定义上来说不会被拦截,无论是对于JDK代理(这不适用)还是对于CGLIB代理(这在技术上是可能的,但不建议用于AOP目的)。因此,任何给定的切入点只会匹配公共方法!

如果您的拦截需求包括受保护/私有方法甚至构造函数,请考虑使用Spring驱动的本地AspectJ编织,而不是Spring基于代理的AOP框架。这构成了一种不同模式的AOP使用,具有不同的特性,因此在做出决策之前,请确保熟悉编织。

因此,您需要使用以下内容启用本地AspectJ编织

这里介绍的示例使用XML风格的配置,也可以使用Java配置来配置和使用@AspectJ。具体而言,可以使用@EnableLoadTimeWeaving注释作为替代方案(有关详情,请参见下文)。
@Configuration
@EnableLoadTimeWeaving
public class ApiConfiguration implements WebMvcConfigurer { /*...*/ }

我已经编辑了帖子。这让服务启动时出现了异常。 - Jordi
@Jordi可以看一下这个链接是否有帮助:https://dev59.com/muo6XIcBkEYKwwoYSChJ - buræquete
@Jordi 抱歉没有及时回复你,但我很想听听你的反馈。 - buræquete
Jordi,最近你在SO上频繁提出与AOP相关的问题,有些问题仍未解决,有些问题则被你自己删除。因此,请至少友善地跟进这些问题,如果有人愿意帮助你,否则你最终会导致人们不再回答你的问题。 - kriegaex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接