【问题标题】:Spring AOP: Capture inner private method calls (@EnableAspectJAutoProxy)Spring AOP:捕获内部私有方法调用(@EnableAspectJAutoProxy)
【发布时间】:2018-11-14 11:15:32
【问题描述】:

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

所以,我需要在我的 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);
    }
}

重要提示privateMethodprivate,仅由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 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:590) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]

【问题讨论】:

  • 我的回答有帮助吗?请告诉我,如果不是,我可以提供更多帮助

标签: spring spring-boot spring-aop


【解决方案1】:

我得到了答案;

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

由于 Spring 的 AOP 框架基于代理的特性,受保护 根据定义,方法不会被拦截,JDK 代理也不会被拦截 (这不适用)也不适用于 CGLIB 代理(如果这是 技术上可行但不推荐用于 AOP 目的)。作为一个 结果,任何给定的切入点都将与公共方法匹配 只有!

如果您的拦截需求包括受保护/私有方法,甚至 构造函数,考虑使用 Spring 驱动的原生 AspectJ 编织 而不是 Spring 的基于代理的 AOP 框架。这构成了一个 不同特性的AOP使用模式不同,所以一定要 在做出决定之前先让自己熟悉编织。

因此,您需要使用以下命令启用native AspectJ weaving

这里展示的示例使用 XML 样式配置,它也是 可以通过 Java 配置来配置和使用 @AspectJ。 具体来说,@EnableLoadTimeWeaving 注释可以用作 替代(详见下文)。

那你可以试试;

@Configuration
@EnableLoadTimeWeaving
public class ApiConfiguration implements WebMvcConfigurer { /*...*/ }

【讨论】:

  • 我已经编辑了帖子。这让我在服务开始时例外。
  • @Jordi 可以 this 帮忙吗?
  • @Jordi 很抱歉没有回来查看此问题,但我很想听听您对此的反馈。
  • Jordi,你最近一直在用 AOP 相关的问题来淹没 SO,有些仍然打开,有些稍后又被你自己删除了。因此,如果有人自愿帮助您,请至少对他们进行跟进,否则您最终将导致人们不再回答您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多